我有一个工作线程处理工作项队列。工作项现在可能无法处理,因此工作线程可能会将它们推回队列中。
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 循环)。
我考虑过将第二个布尔变量(“暂停”)与另一个互斥锁和条件变量结合使用,但是必须处理工作人员等待 queueCondition 上的信号的特殊情况;实际上,该pthread_cond_wait()
调用必须解锁/锁定两个互斥锁。
我想这个问题必须有一个简单的解决方案,但我似乎无法想出它 - 我希望你们中的一些人能够帮助我。
提前非常感谢。