显然,原子操作可以确保不同的线程不会破坏某个值。但是当使用共享内存时,这是否仍然适用于进程?即使操作系统恰好安排进程在不同的内核上运行?或者跨越不同的不同CPU?
编辑:另外,如果它不安全,即使在Linux这样的操作系统上也不安全,因为从调度程序的角度来看,进程和线程是相同的?
答案 0 :(得分:3)
tl; dr:阅读原子操作文档中的细则。有些将是原子设计,但可能会跳过某些变量类型。但是,一般情况下,原子操作将保持其在不同进程之间的契约,就像在线程之间一样。
原子操作实际上只能确保在两个实体同时调用时不会出现不一致的状态。例如,由同一个整数上的两个不同线程或进程调用的原子增量将始终如下:
其中A和B表示进行调用的第一个和第二个线程或进程。
由于竞争条件,对地址空间的写入不完整等原因,非原子操作可能导致不一致或通常是疯狂的结果。例如,您可以很容易地看到:
注意竞赛条件,因为实体B比赛过去A并首先完成表达式。
现在想象一下,如果x是64位双精度,则无法确保具有原子赋值。在这种情况下,你可以很容易地看到这样的东西:
这些非原子分配是您必须诊断的一些最可怕的并发错误。