C++ 既然我们已经有了一个通知变量,为什么还要使用条件变量?

C++ 既然我们已经有了一个通知变量,为什么还要使用条件变量?,c++,multithreading,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 consume

考虑以下代码:

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(); 
}
int main(){
bool done=false;
条件变量con;
互斥m;
线程生成器([&](){
这个线程:睡眠(时间:秒(10));
完成=正确;
//con.通知某人;
});
线程使用者([&](){
/*唯一锁(m);
而(!完成){
con.等待(锁定);
}*/
而(!完成);

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

这比线程“busy waiting”更有效,线程“busy waiting”不断轮询一个变量以检查它是否可以继续。在这种情况下,线程正在耗尽可用于实际工作的CPU周期


此外,您还需要使用条件变量,以正确保护关键部分不被多个线程一次访问。您可能有3个使用者正在运行,但一次只允许一个使用者工作(其他使用者在此之前可能正在执行其他操作)。

等待条件变量时,线程被阻塞当接到通知时,线程将处于就绪状态,以便操作系统可以对其进行调度

这比线程“busy waiting”更有效,线程“busy waiting”不断轮询一个变量以检查它是否可以继续。在这种情况下,线程正在耗尽可用于实际工作的CPU周期


此外,您还需要使用条件变量,以便正确地保护关键部分,使其不被多个线程同时访问。您可能有3个使用者正在运行,但一次只允许一个使用者工作(其他使用者在此之前可能正在做其他事情).

查找阻塞与非阻塞。在while循环中,您至少需要一点睡眠时间,否则您的CPU使用将毫无理由地急剧上升。查找阻塞与非阻塞。在while循环中,您至少需要一点睡眠时间,否则您的CPU使用将毫无理由地急剧上升。
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;
});