我需要交换两个8x字节的内存区域,最有可能使用CMPXCHG8B
。但是,我想尽快做到这一点。其他线程将等待此操作完成。我有几个与此有关的问题:
- 如果我使用多个处理器或多个核心,则仅需要LOCK
前缀?如果可能的话,我真的想避免使用它。
- 我是否能够锁定"如果等待线程希望访问的内存位于不同的缓存行中,则基于MESI协议而不使用LOCK
前缀?
我在一个处理器(多个内核)上运行,但是解答多处理器系统差异的答案 - 如果存在差异则欢迎。
答案 0 :(得分:1)
如果您有多个处理器或多个内核,并且希望对共享变量进行同步安全访问,则无法避免LOCK。 (使用XCHG并不能避免锁定;它只是隐藏在指令中。)
按照杰斯特的提示,我很想给你的两块记忆命名"左边"和"右",并使用FLAG动态重命名它们,例如
GetLeft: if LSB(FLAG) ; least significant bit
Read Left
else Read Right
和
GetRight: if LSB(FLAG)
Read Right
else Read Left
然后以下代码将"交换"他们可以尽快完成:
SwapLeftAndRight:
LOCK INC FLAG ; flips LSB of flag
这消除了对互斥锁的任何需求。 (如果您的主题正在尝试更新这些区域,无论您做什么,都需要互斥锁。)
如果访问速度实际上很关键,那么他关于将两个连续指针交换到LEFT和RIGHT的提示非常好。