我正在阅读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
的读者类似,因此显然存在数据竞争。
答案 0 :(得分:3)
x
和y
为0
,因此if
后面的代码将不会被执行,也不会有写入,因此无法进行数据竞争。
答案 1 :(得分:2)
关键点是:
从
开始x==0
和y==0
由于两个变量在启动时都设置为0
,因此if
测试将失败,并且永远不会发生分配。所以两个线程只读取变量,从不写它们。