2011-02-04 60 views
1

我想在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可以或不可以负载和商店“变种”之间occure处理器0 那么,这个工作还是做我需要自旋锁是这样的:

; 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 

感谢您的任何答复。最好的祝福。

编辑: 换句话说: 我想执行'处理器0'中的连接并需要获取初始值。

回答

0

引用内存的xchg自动锁定总线(或者在数据已经在缓存中时锁定缓存)。请参阅Intel reference manual,第8.3.1节。 (警告:最近我并没有看起来很难,但英特尔曾经重新整理他们的网站,很快使链接无效。如果是这样,谷歌搜索类似“intel reference 3a”应该可以打开它)。

+0

我已经一遍又一遍地读过系统程序指南3A:第8.3节,但特别是上面的情况对我来说并不完全清楚。作为一个侧面说明 - 这不是关于原子性,而是关于指令排序。 – 0xbadf00d 2011-02-04 17:34:57