为什么 C++ 条件变量需要锁?

Why does a C++ conditional variable need a lock?

提问人:jay 提问时间:7/26/2023 更新时间:7/26/2023 访问量:86

问:

如果我使用的是没有谓语的简历。我不太明白我们传入的unique_lock的用途。我检查了这个链接:为什么条件变量需要锁(因此也需要互斥锁)以及来自它的更多链接。

大多数解释都表明,互斥锁用于锁定传递到 CV 中的谓词。那么,如果我不使用谓词函数,为什么需要锁呢?

一个没有锁的假设代码可能看起来像这样:

condition_variable cv;
mutex dataMutex;
string sharedData;
atomic<bool> flag = false;

void doTask(){

    while(!flagSet){ // To prevent spurious wake-up
        cv.wait(); //Just wait, no lock/predicate passed in.
    }
    
    lock_guard<mutex> lock(dataMutex); //Get a lock and read shared data
    cout << sharedData;
}

void createTask(){
    lock_guard<mutex> lock(dataMutex); //Get a lock and update the shared data
    sharedData = "abc";
    flag = true;
    
    cv.notify_all();

}

int main(){
    thread a(doTask, 10);
    sleep(seconds(5));
    thread b = thread(createTask);
    
    // Join the threads and return.
}

可能 cv 可以在内部使用互斥锁来同步等待和通知,但为什么它需要外部互斥锁。当我没有谓词时,谁能帮助理解外部锁的使用?

C++ 变量 条件语句

评论

1赞 pptaszni 7/26/2023
在您的链接 stackoverflow.com/a/2763749/4165552 讨论之一中,它确实得到了详尽的解释。你还需要什么?
1赞 Alan Birtles 7/26/2023
如果没有锁,您的代码就会出现争用条件,导致它永远等待,当它被选中时被取消设置,但在调用时间之前设置flagwait
1赞 Louis Go 7/26/2023
不输入锁时如何与他人同步?如果您不需要同步,那么也不需要 CV。
1赞 Alan Birtles 7/26/2023
不,这与虚假唤醒无关,无论有没有它们,都会发生争用条件
1赞 Eljay 7/26/2023
如果你去掉关于虚假电话的红鲱鱼,那么这基本上是真的。

答: 暂无答案