【问题标题】:Is "lock" opcode prefix of no use because of "cache coherency mechanism"?由于“缓存一致性机制”,“锁定”操作码前缀没有用吗?
【发布时间】:2023-03-25 23:48:01
【问题描述】:

英特尔手册说:

8.1.4 LOCK 操作对内部处理器缓存的影响
...
缓存一致性机制自动防止两个或多个缓存了同一内存区域的处理器同时修改该区域中的数据。

这是否意味着lock 操作码前缀对于应用程序编程毫无用处?

CPU 缓存始终打开,所有应用程序可访问的内存都是可缓存的,因此缓存一致性机制始终处于警惕状态,以保护存储在共享内存中的数据的完整性。

“缓存一致性机制”是多核CPU缓存的固有组成部分,无论您是否使用lock前缀,它始终独立工作。

更详细的问题:
我有 Core2Duo CPU,我的应用程序在 2 个并行线程中运行,使用公共全局变量。
lock add [ESI],EAXlock cmpxchg8b [ESI] 等指令中跳过lock 前缀是否安全?

【问题讨论】:

  • 不,省略它是不安全的。缓存一致性不会使指令原子化。
  • 例如,一致性机制仅防止核心 A 的 L1 具有与核心 B 的 L1 不同数据的缓存行的缓存副本的可能性。要添加到罗斯的答案,请注意 add [esi], eax 实际上是加载、添加和存储。

标签: multithreading assembly concurrency x86 cpu-cache


【解决方案1】:

不,如果没有 LOCK 前缀,缓存锁将不会在整个读/修改/写操作中保持。这意味着该操作不会对其他处理器显示为原子操作。 LOCK 前缀还强制执行严格的内存排序,而不是通常使用的更宽松的强内存排序。

【讨论】:

    猜你喜欢
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多