为什么开发人员在多线程代码的读/写期间锁定字长数据?

时间:2013-07-08 14:50:44

标签: c++ c multithreading locking atomic

特别是在非托管语言(例如C ++,C)中,我的理解是字长数据的读/写是原子的。如果是这种情况那么为什么人们在多线程环境中的读/写期间仍然会锁定(通过互斥)字长数据?

4 个答案:

答案 0 :(得分:8)

读取和写入可以是单独原子的,但读取 - 修改 - 写入序列不是。

*这在很大程度上取决于架构以及如何使用它。

答案 1 :(得分:5)

只要数据正确对齐(特别是整个单词位于同一缓存行中),Intel x86(或兼容)处理器将以原子方式进行字大小的读写操作。

虽然存在两个明显的问题:

  1. 错误的对齐会破坏它
  2. 它不可移植 - 不同的CPU也可能会破坏它
  3. 不太明显,原子操作可以强制使用内存栅栏,以便按正确的顺序进行操作。例如,如果我正在编写一些数据,然后编写一个状态变量来告诉另一个进程数据现在是有效的,那么每个写入都是原子的是不够的 - 只有设置“有效”状态才是至关重要的。 之后实际上已经写入了数据本身。如果没有某种内存栅栏操作,处理器可以自由重新排列写入,因此可以在数据之前写入状态。

答案 2 :(得分:5)

这取决于你所说的“原子”。有任何 在C ++中保证实际读取或写入变量 最终在全局内存中,其他线程可以看到它。

答案 3 :(得分:2)

因为C或C ++等语言的赋值(我认为你的意思是读/写数据)可能仍然是多个汇编指令,并且线程可以被抢占。