[英]On a multicore x86, is a LOCK necessary as a prefix to XCHG?
如果mem
是共享內存位置,我是否需要:
XCHG EAX,mem
要么:
LOCK XCHG EAX,mem
原子地進行交換?
谷歌搜索這會產生是和否答案。 有沒有人知道這個?
英特爾的文檔似乎很清楚它是多余的。
IA-32英特爾®體系結構軟件開發人員手冊第3A卷:系統編程指南,第1部分
7.1.2.1說:
處理器自動遵循LOCK語義的操作如下:
- 執行引用內存的XCHG指令時。
同樣的,
英特爾®64和IA-32架構軟件開發人員手冊卷2B:指令集參考,NZ
XCHG:
如果引用了內存操作數,則無論是否存在LOCK前綴或IOPL的值,處理器的鎖定協議都會在交換操作期間自動實現。
請注意,這實際上並不意味着無論是否使用LOCK前綴都會聲明LOCK#信號,7.1.4描述了如果內存位置被緩存,后續處理器如何在沒有LOCK#的情況下保留鎖定語義。 聰明,絕對是我的頭腦。
從386天開始,無論你是否在其上放置鎖定前綴,xchg都會斷言鎖定信號。 英特爾的文檔在IA-32指令集參考NZ中非常清楚地涵蓋了這一點。
根據80386使用說明書 , BUS LOCK
在交換期間有效。 LOCK
前綴對此操作沒有優先權, I / O權限級別的值也沒有優先級 。
我的建議是,由於文檔指出BUS LOCK
而不管存在的斷言LOCK
前綴, LOCK XCHG EAX, mem
是安全的,否則。 如有疑問,請添加LOCK
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.