我在Memory Model阅读Bjarne的常见问题解答,这是一个引用
因此,C 11保证“单独的存储器位置”不会出现这样的问题 . 更确切地说:除非它们都是读访问,否则两个线程无法安全地访问存储器位置,除非它们都是读访问 . 注意不同的位域内单个字不是单独的内存位置,所以不要在没有某种形式锁定的情况下在线程之间共享带有位域的结构 . 除了这个警告之外,C内存模型只是“像每个人都期望的那样 . ”然而,它并不总是容易的直接思考低级并发问题 . 考虑:从x == 0开始,y == 0如果(x)y = 1; //线程1 if(y)x = 1; //线程2这里有问题吗?更确切地说,是否有数据竞争? (不,没有) .
我的问题是,为什么没有数据竞争?很明显,由于线程1是 y
的编写者,而线程2是 y
的读者,而且 x
类似,因此显然存在数据竞争 .
2 回答
x
和y
是0
因此if
后面的代码将不会被执行,也不会有写入,因此不会有数据争用 .关键点是:
由于两个变量在启动时都设置为
0
,因此if
测试将失败,并且永远不会发生分配 . 所以两个线程只读取变量,从不写它们 .