特别是在非托管语言(例如C ++,C)中,我的理解是字长数据的读/写是原子的。如果是这种情况那么为什么人们在多线程环境中的读/写期间仍然会锁定(通过互斥)字长数据?
答案 0 :(得分:8)
读取和写入可以是单独原子的,但读取 - 修改 - 写入序列不是。
*这在很大程度上取决于架构以及如何使用它。
答案 1 :(得分:5)
只要数据正确对齐(特别是整个单词位于同一缓存行中),Intel x86(或兼容)处理器将以原子方式进行字大小的读写操作。
虽然存在两个明显的问题:
不太明显,原子操作可以强制使用内存栅栏,以便按正确的顺序进行操作。例如,如果我正在编写一些数据,然后编写一个状态变量来告诉另一个进程数据现在是有效的,那么每个写入都是原子的是不够的 - 只有设置“有效”状态才是至关重要的。 之后实际上已经写入了数据本身。如果没有某种内存栅栏操作,处理器可以自由重新排列写入,因此可以在数据之前写入状态。
答案 2 :(得分:5)
这取决于你所说的“原子”。有不任何 在C ++中保证实际读取或写入变量 最终在全局内存中,其他线程可以看到它。
答案 3 :(得分:2)
因为C或C ++等语言的赋值(我认为你的意思是读/写数据)可能仍然是多个汇编指令,并且线程可以被抢占。