c++ - 单条件变量是否可以用于双向同步?

标签 c++ multithreading c++11 condition-variable

是否可以使用单个条件变量进行双向同步(即在不同时间等待同一条件变量的两个不同条件)?我确信在任何时候都不会有超过一个线程等待条件变量。下面的示例代码说明了我的想法:

#include <condition_variable>
#include <thread>
#include <mutex>
#include <iostream>

std::condition_variable condvar;
std::mutex mutex;
int i;

void even()
{
    while (i < 10000) {
        std::unique_lock<std::mutex> lock(mutex);
        if (i % 2 != 0) {
            condvar.notify_one();
            condvar.wait(lock, [&](){ return i % 2 == 0; });
        }
        i++;
        std::cout << i << std::endl;
    }
    condvar.notify_one();
}

void odd()
{
    while (i < 10001) {
        std::unique_lock<std::mutex> lock(mutex);
        if (i % 2 != 1) {
            condvar.notify_one();
            condvar.wait(lock, [&](){ return i % 2 == 1; });
        }
        i++;
        std::cout << i << std::endl;
    }
}

int main()
{
    i = 0;
    std::thread a(even);
    std::thread b(odd);
    a.join();
    b.join();
}

最佳答案

是的,它非常安全。但是,当您实际上想要通知等待条件的所有线程时,我不会养成调用 notify_one 的习惯,即使您“知道”只有一个线程会等待。

关于c++ - 单条件变量是否可以用于双向同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344809/

相关文章:

c++ - 没有名字的变量的销毁顺序

c++ - 如何合并两个 mpl map 生成新 map ?

c++ - 可以将容器的复制构造函数定义为不可复制值类型的删除吗?

c# - 线程 block

c++ - 排序插入到小(255 个元素)列表中

c - 将两个或多个线程组合在一起

c++ - 线程控制台窗口的高效实现

c++ - uniform_int_distribution 在这里用错了吗? (我的结果似乎分布不均)

c++ - 让 Boost asio 工作

c++ - 使用赋值运算符返回 *this