c++ - 当我们已经有一个通知变量时,为什么要使用 condition_variable?

标签 c++ multithreading condition-variable

考虑以下代码:

int main() { 
    bool done = false; 
    condition_variable con;
    mutex m;

    thread producer([&]() {
        this_thread::sleep_for(chrono::seconds(10)); 
        done = true;
        //con.notify_one();
    });

    thread consumer([&]() {
        /*unique_lock<mutex> lock(m);
        while (!done) {
            con.wait(lock);
        }*/
        while (!done);
        cout << "now my turn..."<<endl;
    });

    producer.join();
    consumer.join(); 
}

如果我取消注释 2 个线程中的代码,我将使用条件变量。所以消费者线程看起来像这样:

thread consumer([&]() {
    unique_lock<mutex> lock(m);
    while (!done) {
        con.wait(lock);
    } 
    // while (!done); <-this is equivalent of the above
    cout << "now my turn..."<<endl;
});

似乎我可以使用/不使用 condition_variable 来实现同样的事情。 所以我的问题是:如果已经使用了通知变量(在本例中为“完成”变量),为什么我们需要 condition_variable?使用它有什么好处?我可以做一些通知变量不能做的事情吗?

最佳答案

当等待条件变量时,线程被阻塞(即不执行)。当收到通知时,线程将进入就绪状态,以便操作系统可以对其进行调度。

这比“忙等待”线程更有效,后者不断轮询变量以检查它是否可以继续。在这种情况下,线程会用完本可用于实际工作的 CPU 周期。

您还需要使用条件变量来正确保护临界区不被多个线程同时访问。您可能有 3 个消费者在运行,但一次只允许一个消费者工作(其他人可能在那之前正在做其他事情)。

关于c++ - 当我们已经有一个通知变量时,为什么要使用 condition_variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35024887/

相关文章:

c# - SynchronizationContext 有什么作用?

java - 阻塞队列是否需要同步块(synchronized block)

c++ - 错误编译 "CONDITION_VARIABLE undeclared"

javascript - 我可以通过 javaScript 运行可执行文件吗?

C++ bool 代数

java - jvm 线程 block 计数的 SNMP OID 是多少

c++ - condition_variable 等待参数?

c++ - 如何在生产者-消费者场景中使用 Boost 条件变量?

c++ - 什么标准条款强制执行这种左值到右值的转换?

c++ - 保留字典顺序的原始类型的字符串编码