二进制信号量和互斥量之间是否存在差异,或它们基本相同?
为什么std::condition_variable::wait需要一个互斥体作为其变量之一?
您可以查看文档并引用:
wait... Atomically releases lock
Run Code Online (Sandbox Code Playgroud)
但这不是真正的原因。这只是进一步验证了我的问题:为什么它首先需要它?
谓词最有可能查询共享资源的状态,它必须受到锁保护。
好的。公平的。这里有两个问题
int i = 0;
void waits()
{
std::unique_lock<std::mutex> lk(cv_m);
cv.wait(lk, []{return i == 1;});
std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
int i = 0;
void waits()
{
cv.wait(lk);
std::unique_lock<std::mutex> lk(cv_m);
std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
我知道这种做法没有有害影响。我只是不知道如何向自己解释为什么它是这样设计的?
如果谓词是可选的并且没有传递给wait,为什么我们需要锁?
阅读文本,因为std::condition_variable我遇到了这句话:
即使共享变量是原子的,也必须在互斥锁下进行修改,才能将修改正确发布到等待线程。
我的问题是这样的:
如果不是“与 POD 一起工作的无锁代码”,原子有什么用?
更新
看起来我的问题有些混乱:(
引用文本中的“共享变量”与“条件变量”不同。请参阅同一页面中的此引用:
...直到另一个线程同时修改共享变量(条件),并通知condition_variable
请不要回答“为什么我们需要使用带有条件变量的互斥锁”或“条件等待如何工作”,而是提供有关互斥锁的使用如何“正确发布”对等待线程的原子修改的信息,即是否需要在互斥锁下完成像++counter;(而不是像测试if(counter == 0))这样的表达式?