3

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

4

4 回答 4

8

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

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

于 2013-07-08T14:56:25.057 回答
5

英特尔 x86(或兼容)处理器将自动执行字大小的读取和写入,只要数据正确对齐(特别是整个字位于同一高速缓存行中)。

但是有两个明显的问题:

  1. 不正确的对齐可能会破坏它
  2. 它不是便携式的——不同的 CPU 也可能会破坏它

不太明显的是,原子操作可以强制使用内存栅栏,以便操作以正确的顺序发生。例如,如果我正在写入一些数据,然后写入一个状态变量来告诉另一个进程数据现在是有效的,那么这些写入中的每一个都是原子的是不够的 - 仅设置“有效”状态至关重要实际写入数据本身之后。如果没有某种内存栅栏操作,处理器可以自由地重新排列写入,以便可以在数据之前写入状态。

于 2013-07-08T14:54:03.833 回答
5

这取决于您所说的“原子”是什么意思。在C++ 中,不能保证对变量的读取或写入实际上最终会在其他线程可以看到的全局内存中结束。

于 2013-07-08T14:55:40.463 回答
2

因为像 C 或 C++ 这样的语言中的赋值(我假设你的意思是读/写数据)可能仍然是多个汇编指令,并且线程可以在其中任何一个上被抢占。

于 2013-07-08T14:52:34.340 回答