2011-02-04 69 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