我有一个工作线程处理一个工作项队列。工作项现在可能无法处理,因此工作线程可能会将它们推回队列。
void* workerFunc(void* arg) {
WorkItem* item = NULL;
while(true) {
{
scoped_lock(&queueMutex);
while(workerRunning && workQueue.empty())
pthread_cond_wait(&queueCondition, &queueMutex);
if(!workerRunning)
break;
item = workQueue.front();
workQueue.pop();
}
// process item, may take a while (therefore no lock here),
// may also be considered unprocessable
if(unprocessable) {
scoped_lock(&queueMutex);
workQueue.push(item);
}
}
return NULL;
}
现在我需要执行以下操作:有时,我需要扫描工作队列以删除不再需要的项目(来自将工作项目排入队列的同一线程)。我不能为此使用 queueMutex,因为我可能会错过当前正在处理的项目,所以我需要一种方法来暂停整个处理线程,所有未完成的项目实际上都在队列中(最好是在队列的顶部) while 循环)。
我考虑过将第二个 bool 变量(“暂停”)与另一个互斥量和条件变量结合使用,但是必须处理工作人员正在等待 queueCondition 上的信号的特殊情况;实际上,pthread_cond_wait()
调用必须解锁/锁定两个互斥量。
我想这个问题一定有一个简单的解决方案,但我似乎无法想出它 - 我希望你们中的一些人能够帮助我。
非常感谢。
最佳答案
基本上,您需要在 POSIX 上模拟 WinAPI 的 WaitForMultipleObjects()
调用。 POSIX 没有像 WinAPI 那样的单一 API 来等待所有类型的事件/对象。
使用pthread_cond_timedwait
和clock_gettime
。可以引用这篇论文WaitFor API有关许多实现细节。
那里有一些有趣的代码(太多无法在答案中发布,但可用)可以解决您的问题。
P.S. 请引用这个问题进行讨论:WaitForSingleObject and WaitForMultipleObjects equivalent in linux
关于c++ - 两种不同条件下的 pthread 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11290089/