IA-32 |在多处理器环境中重新排序问题

时间:2011-02-04 17:00:45

标签: serialization assembly x86 ia-32

我想在IA-32上执行原子'和'操作。

请考虑以下情况:

; processor 0
lea     edx, var
mov  ecx, mask
mov  eax, [edx]
lock and [edx], ecx

; processor 1
lea     edx, var
mov  eax, 0xff
xchg [edx], eax

我不确定处理器1的'var'存储是否可能或者不能在处理器0的负载和存储之间发生'var'。 那么,这是工作还是我需要像这样旋转锁:

; processor 0
push ebx
lea  edx, var
mov  ecx, mask
@@loop:
mov  ebx, [edx]
mov  eax, ebx
and  eax, ecx
lock cmpxchg [edx], eax
cmp  eax, ebx
jne  @@loop
pop  ebx

感谢您的回答。最好的问候。

编辑: 换一种说法: 我想在'Processor 0'中执行连接并需要获取初始值。

1 个答案:

答案 0 :(得分:0)

引用内存的xchg会自动锁定总线(或者当数据已经存在于缓存中时锁定缓存)。参见Intel reference manual,§8.3.1。 (警告:我最近没有看好,但是英特尔过去常常重新安排他们的网站,很快就会使链接无效。如果是这样的话,谷歌搜索“intel reference 3a”这样的东西应该会把它打开)。