相关疑难解决方法(0)

二进制信号量和互斥量之间的区别

二进制信号量和互斥量之间是否存在差异,或它们基本相同?

glossary operating-system mutex semaphore binary-semaphore

787
推荐指数
19
解决办法
56万
查看次数

条件变量,互斥锁和锁之间的差异

例如c ++ 0x接口

我很难搞清楚何时使用这些东西(简称cv,互斥锁和锁).任何人都可以解释或指向一个资源?

提前致谢.

c++ multithreading mutex condition-variable c++11

47
推荐指数
3
解决办法
4万
查看次数

为什么 std::condition_variable::wait 需要互斥锁?

TL; 博士

为什么std::condition_variable::wait需要一个互斥体作为其变量之一?


答案 1

您可以查看文档并引用:

 wait... Atomically releases lock
Run Code Online (Sandbox Code Playgroud)

但这不是真正的原因。这只是进一步验证了我的问题:为什么它首先需要它?

答案 2

谓词最有可能查询共享资源的状态,它必须受到锁保护。

好的。公平的。这里有两个问题

  1. 谓词查询共享资源的状态总是正确的吗?我假设是的。否则对我来说实施它没有意义
  2. 如果我不传递任何谓词(它是可选的)怎么办?

使用谓词 - 锁定有意义

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,为什么我们需要锁?

multithreading mutex condition-variable wait c++11

7
推荐指数
2
解决办法
4120
查看次数

如果仍然需要互斥锁才能正常工作,为什么要使用 std::atomic

阅读文本,因为std::condition_variable我遇到了这句话:

即使共享变量是原子的,也必须在互斥锁下进行修改,才能将修改正确发布到等待线程。

我的问题是这样的:

如果不是“与 POD 一起工作的无锁代码”,原子有什么用?

更新

看起来我的问题有些混乱:(

引用文本中的“共享变量”与“条件变量”不同。请参阅同一页面中的此引用:

...直到另一个线程同时修改共享变量(条件),并通知condition_variable

请不要回答“为什么我们需要使用带有条件变量的互斥锁”或“条件等待如何工作”,而是提供有关互斥锁的使用如何“正确发布”对等待线程的原子修改的信息,即是否需要在互斥锁下完成像++counter;而不是像测试if(counter == 0))这样的表达式?

c++ mutex atomic stdatomic stdmutex

-1
推荐指数
1
解决办法
681
查看次数