3

我有一个工作线程处理工作项队列。工作项现在可能无法处理,因此工作线程可能会将它们推回队列中。

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()调用必须解锁/锁定两个互斥锁。

我想这个问题必须有一个简单的解决方案,但我似乎无法想出它 - 我希望你们中的一些人能够帮助我。

提前非常感谢。

4

1 回答 1

4

基本上你需要WaitForMultipleObjects()在 POSIX 上模拟 WinAPI 的调用。POSIX 没有像 WinAPI 那样等待所有类型的事件/对象的单一 API。

使用pthread_cond_timedwaitclock_gettime。您可以参考这篇论文WaitFor API了解许多实现细节。

那里有一些有趣的代码(在答案中发布太多,但可用)可以解决您的问题。

PS参考这个问题进行讨论:WaitForSingleObject and WaitForMultipleObjects equivalent in linux

于 2012-07-02T08:30:59.773 回答