单个条件变量可以用于双向同步吗?

4 c++ multithreading condition-variable c++11

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

#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();
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 6

是的,这是非常安全的.但是,notify_one当你真正想要通知所有等待条件的线程时,我不会养成调用的习惯,即使你"知道"只有一个线程会等待.

  • 如果我读得正确,OP正在使用谓词版本的`wait`,它等待谓词自动为真. (4认同)