我有一个工作线程处理工作项的队列。工作项目现在可能无法处理,因此工作线程可能会将它们推回队列。
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变量(“暂停”)与另一个互斥锁和条件变量的组合,但是然后必须处理worker等待queueCondition上的信号的特殊情况;实际上pthread_cond_wait()
调用必须解锁/锁定两个互斥锁。
我想这个问题必须有一个简单的解决方案,但我似乎无法想出来 - 我希望你们中的一些人能够帮助我。
提前多多感谢。
答案 0 :(得分:4)
基本上你需要在POSIX上模拟WinAPI的WaitForMultipleObjects()
调用。 POSIX没有一个API可以像WinAPI那样等待所有类型的事件/对象。
使用pthread_cond_timedwait
和clock_gettime
。您可以参考本文WaitFor API了解许多实现细节。
有一些有趣的代码(在答案中发布的内容太多,但可用)可以解决您的问题。
P.S。请参阅此问题进行讨论:WaitForSingleObject and WaitForMultipleObjects equivalent in linux