如果mem
是一個共享的存儲位置,我需要:在多核x86上,是否需要LOCK作爲XCHG的前綴?
XCHG EAX,mem
或:
LOCK XCHG EAX,mem
原子地做交換?
使用谷歌搜索這將產生是和沒有答案。有誰知道這明確嗎?
如果mem
是一個共享的存儲位置,我需要:在多核x86上,是否需要LOCK作爲XCHG的前綴?
XCHG EAX,mem
或:
LOCK XCHG EAX,mem
原子地做交換?
使用谷歌搜索這將產生是和沒有答案。有誰知道這明確嗎?
根據80386 Instruction Manual,在交換期間斷言BUS LOCK
。 LOCK
前綴對此操作沒有優先級,I/O Privilege Level的值也不是。
我的建議是,由於文檔指出BUS LOCK
而不管LOCK
前綴的存在斷言,LOCK XCHG EAX, mem
是安全的,否則。如有疑問,請添加LOCK
。
自386天以來,無論您是否將鎖前綴放在上面,xchg都會聲明鎖定信號。在IA-32指令集參考N-Z中,Intel's documentation對此非常清楚。
英特爾的文檔似乎很清楚,它是多餘的。
IA-32英特爾®架構 軟件開發人員手冊 卷3A: 系統編程指南,第1部分
7.1.2.1說:
上的處理器自動跟蹤鎖定操作語義如下 :
- 當執行引用m的XCHG指令埃默裏。
同樣,
英特爾®64和IA-32架構 軟件開發人員手冊 卷2B: 指令集參考,NZ
XCHG:
如果內存操作數被引用時,處理器的鎖定協議自動爲 impl無論是否存在LOCK前綴或IOPL的值,都會在交換操作期間出現。
注意,這實際上並不意味着LOCK#信號鎖定前綴是否被使用,7.1.4介紹如何在以後的處理器鎖定機制沒有LOCK#被保存,如果存儲位置被緩存。聰明,肯定在我的頭上。
Oracle Hotspot JVM上的PrintAssembly選項似乎也同意這一點。在生成彙編時,它在x86-64上的xchg指令上沒有鎖定前綴。 – 2013-11-13 22:29:14