c++ - 两种不同条件下的 pthread 同步

标签 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 变量(“暂停”)与另一个互斥量和条件变量结合使用,但是必须处理工作人员正在等待 queueCondition 上的信号的特殊情况;实际上,pthread_cond_wait() 调用必须解锁/锁定两个互斥量。

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

非常感谢。

最佳答案

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

使用pthread_cond_timedwaitclock_gettime。可以引用这篇论文WaitFor API有关许多实现细节。

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

P.S. 请引用这个问题进行讨论:WaitForSingleObject and WaitForMultipleObjects equivalent in linux

关于c++ - 两种不同条件下的 pthread 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11290089/

相关文章:

python - 在 C++ 中使用 Python 对象

c++ - 使用 system() 启动另一个可执行文件时程序停止

git - 如何同步从 Machine1 推送到 Git 存储库的 Machine2 上相同的现有项目?

java - 对java中的线程感到困惑

c - 如何创建和显示线程的属性

c - 多线程应用程序中的错误处理

c++ - Qt QTreeWidget 一项一项添加

c++ - 如何获取 constexpr 变量作为声明(内置)数组的维度?

包含可变字段的 Java 1.4 单例

c++ - volatile 文件间或线程间?