![]() |
1
5
简而言之,它非常依赖于CPU和编译器。 假设您有一个包含零的32位值,线程A想要设置位0,线程B想要设置位1。 正如您所描述的,这些是读-修改-写操作,同步问题是“如果它们发生冲突会发生什么”。 您需要避免的情况是:
…当正确的结果是…
在某些处理器上,读-修改-写将是三个独立的指令,因此需要同步。在其他方面,它将是一个单一的原子指令。在多个核心/CPU系统上,它将是一条单指令,但其他核心/CPU可能能够访问,因此再次需要同步。 用字节来做可以是相同的。在某些处理器内存体系结构中,只能写入32位内存值,因此字节更新需要像以前一样进行读-修改-写操作。 x86体系结构(尤其是Windows)的更新 Windows提供了一组32位值的原子“互锁”操作,包括 Logical OR . 在避免关键部分时,这些可能对您有很大帮助。但要小心,因为正如陈瑞蒙指出的, they don't solve everything . 一直读那篇文章直到你明白! |
![]() |
2
2
这些细节将依赖于系统,并且可能依赖于编译器。我想,在你摆脱恐惧的影响之前,你可能需要一直到32位整数。 |
![]() |
3
1
|
![]() |
J. Defenses · 节点JS,NeDB-如何使同步返回到父模块 6 年前 |
![]() |
StefanoN · Java多线程-按顺序只运行一次线程运行方法 6 年前 |
![]() |
merlin2011 · Android线程方法是否隐式同步? 6 年前 |
![]() |
ninbura · ffmpeg-时间码和分数帧速率(复制帧) 6 年前 |
![]() |
ninbura · 分段时音频缓慢去同步 6 年前 |