为什么没有数据竞争?

时间:2017-03-29 21:36:10

标签: c++ multithreading c++11

我正在阅读Bjarne关于Memory Model的常见问题解答,这里是引用

  

因此,C ++ 11保证“单独的内存位置”不会出现这样的问题。更准确地说:两个线程无法安全地访问内存位置而没有某种形式的锁定,除非它们都是读访问。单个字内的不同位域不是单独的内存位置,因此不要在没有某种形式锁定的情况下在线程之间共享带有位域的结构。除了这个警告之外,C ++内存模型只是“像所有人期望的那样。”

     

然而,直接思考低级并发问题并不总是容易的。考虑:

     

从x == 0和y == 0

开始      

if(x)y = 1; //线程1

     

if(y)x = 1; //线程2

     

这里有问题吗?更确切地说,是否有数据竞争? (不,没有)。

我的问题是,为什么没有数据竞争?很明显,由于线程1是y的编写者,而线程2是y的读者,而x的读者类似,因此显然存在数据竞争。

2 个答案:

答案 0 :(得分:3)

xy0,因此if后面的代码将不会被执行,也不会有写入,因此无法进行数据竞争。

答案 1 :(得分:2)

关键点是:

  

x==0y==0

开始

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