【发布时间】:2023-03-25 23:48:01
【问题描述】:
英特尔手册说:
8.1.4 LOCK 操作对内部处理器缓存的影响
...
缓存一致性机制自动防止两个或多个缓存了同一内存区域的处理器同时修改该区域中的数据。
这是否意味着lock 操作码前缀对于应用程序编程毫无用处?
CPU 缓存始终打开,所有应用程序可访问的内存都是可缓存的,因此缓存一致性机制始终处于警惕状态,以保护存储在共享内存中的数据的完整性。
“缓存一致性机制”是多核CPU缓存的固有组成部分,无论您是否使用lock前缀,它始终独立工作。
更详细的问题:
我有 Core2Duo CPU,我的应用程序在 2 个并行线程中运行,使用公共全局变量。
在lock add [ESI],EAX 和lock cmpxchg8b [ESI] 等指令中跳过lock 前缀是否安全?
【问题讨论】:
-
不,省略它是不安全的。缓存一致性不会使指令原子化。
-
例如,一致性机制仅防止核心 A 的 L1 具有与核心 B 的 L1 不同数据的缓存行的缓存副本的可能性。要添加到罗斯的答案,请注意
add [esi], eax实际上是加载、添加和存储。
标签: multithreading assembly concurrency x86 cpu-cache