【问题标题】:Why there is no data race?为什么没有数据竞赛?
【发布时间】:2017-03-29 21:36:10
【问题描述】:

我正在阅读 Bjarne 在 Memory Model 上的常见问题解答,这是一个引用

因此,C++11 保证“单独的内存位置”不会发生此类问题。更准确地说:除非它们都是读访问,否则两个线程无法在没有某种形式的锁定的情况下安全地访问内存位置。请注意,单个单词中的不同位域不是单独的内存位置,因此不要在没有某种形式的锁定的情况下在线程之间与位域共享结构。除此之外,C++ 内存模型只是“正如每个人所期望的那样。”

但是,直接思考低级并发问题并不总是那么容易。考虑:

从 x==0 和 y==0 开始

如果 (x) y = 1; // 线程 1

如果 (y) x = 1; // 线程 2

这里有问题吗?更准确地说,是否存在数据竞赛? (不,没有)。

我的问题是,为什么没有数据竞赛?对我来说很明显存在数据竞争,因为线程 1 是 y 的写入器,而线程 2 是 y 的读取器,x 的读取器也是如此。

【问题讨论】:

  • 这里以(0,0)开头是重点

标签: c++ multithreading c++11


【解决方案1】:

xy0,因此if 后面的代码不会被执行,也不会发生写入,因此不会发生数据竞争。

【讨论】:

  • 那么 Bjarne 的例子有什么意义呢?对我来说看起来相当琐碎,但他写它好像有一个隐藏的问题......
  • @zett42 在我得到它之前我必须阅读它 10 次,并且 OP 必须要求 SO 才能得到它。关键是,即使是这个极其简单的例子也会让人感到困惑。也许这有点太简单了,让你感到困惑,但是关于线程安全的推理很难的一般观点仍然存在。
  • 这只是让我感到困惑,因为他写了it is not always easy to think straight ;-)
【解决方案2】:

关键点是:

x==0y==0 开头

由于两个变量在启动时都设置为0if 测试将失败,并且永远不会发生分配。所以两个线程都只读取变量,从不写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多