在两种不同的条件下进行pthread同步

时间:2012-07-02 08:24:31

标签: c++ synchronization pthreads conditional mutex

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

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

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

提前多多感谢。

1 个答案:

答案 0 :(得分:4)

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

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

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

P.S。请参阅此问题进行讨论:WaitForSingleObject and WaitForMultipleObjects equivalent in linux