[英]Does the semantics of `std::memory_order_acquire` requires processor instructions on x86/x86_64?
眾所周知,在x86上運行load()
和store()
內存障礙memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel
不需要處理器指令用於緩存和管道,而匯編程序的代碼總是對應於std::memory_order_relaxed
,這些只有優化編譯器才需要限制: http : //www.stdthread.co.uk/forum/index.php? topic = 72.0
此代碼反匯編代碼確認了store()
(MSVS2012 x86_64 ):
std::atomic<int> a;
a.store(0, std::memory_order_relaxed);
000000013F931A0D mov dword ptr [a],0
a.store(1, std::memory_order_release);
000000013F931A15 mov dword ptr [a],1
但是這段代碼並沒有使用lock cmpxchg
來確認load()
( MSVS2012 x86_64 ):
int val = a.load(std::memory_order_acquire);
000000013F931A1D prefetchw [a]
000000013F931A22 mov eax,dword ptr [a]
000000013F931A26 mov edx,eax
000000013F931A28 lock cmpxchg dword ptr [a],edx
000000013F931A2E jne main+36h (013F931A26h)
std::cout << val << "\n";
但安東尼威廉姆斯說 :
some_atomic.load(std :: memory_order_acquire)只是簡單地加載到一個簡單的加載指令 ,some_atomic.store(std :: memory_order_release)直接轉到一個簡單的存儲指令。
我錯在哪里,並且std::memory_order_acquire
的語義std::memory_order_acquire
需要x86 / x86_64上的處理器指令lock cmpxchg
或只需要一個簡單的加載指令mov
作為安東尼威廉姆斯?
答案:它與此錯誤報告相同: http : //connect.microsoft.com/VisualStudio/feedback/details/770885
std::memory_order_acquire
的語義不需要x86 / x86_64上的處理器指令。
x86_64上的任何load()/ store()操作都不需要處理器指令(鎖定/柵欄)精確的atomic.store(val, std::memory_order_seq_cst);
需要(LOCK) XCHG
或替代: MOV (into memory),MFENCE
。
處理器內存屏障 - x86指令(CAS除外),以及ARM和PowerPC: http : //www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html
反匯編程序GCC 4.8.1 x86_64 - GDB - load() :
20 temp = a.load(std::memory_order_relaxed);
21 temp = a.load(std::memory_order_acquire);
22 temp = a.load(std::memory_order_seq_cst);
0x46140b <+0x007b> mov 0x38(%rsp),%ebx
0x46140f <+0x007f> mov 0x34(%rsp),%esi
0x461413 <+0x0083> mov 0x30(%rsp),%edx
反匯編程序GCC 4.8.1 x86_64 - GDB - store() :
a.store(temp, std::memory_order_relaxed);
a.store(temp, std::memory_order_release);
a.store(temp, std::memory_order_seq_cst);
0x4613dc <+0x004c> mov %eax,0x20(%rsp)
0x4613e0 <+0x0050> mov 0x38(%rsp),%eax
0x4613e4 <+0x0054> mov %eax,0x20(%rsp)
0x4613e8 <+0x0058> mov 0x38(%rsp),%eax
0x4613ec <+0x005c> mov %eax,0x20(%rsp)
0x4613f0 <+0x0060> mfence
0x4613f3 <+0x0063> mov %ebx,0x20(%rsp)
反匯編程序MSVS 2012 x86_64 - load() - 它與此錯誤報告相同: http : //connect.microsoft.com/VisualStudio/feedback/details/770885 :
temp = a.load(std::memory_order_relaxed);
000000013FE51A1F prefetchw [a]
000000013FE51A24 mov eax,dword ptr [a]
000000013FE51A28 nop dword ptr [rax+rax]
000000013FE51A30 mov ecx,eax
000000013FE51A32 lock cmpxchg dword ptr [a],ecx
000000013FE51A38 jne main+40h (013FE51A30h)
000000013FE51A3A mov dword ptr [temp],eax
temp = a.load(std::memory_order_acquire);
000000013FE51A3E prefetchw [a]
000000013FE51A43 mov eax,dword ptr [a]
000000013FE51A47 nop word ptr [rax+rax]
000000013FE51A50 mov ecx,eax
000000013FE51A52 lock cmpxchg dword ptr [a],ecx
000000013FE51A58 jne main+60h (013FE51A50h)
000000013FE51A5A mov dword ptr [temp],eax
temp = a.load(std::memory_order_seq_cst);
000000013FE51A5E prefetchw [a]
temp = a.load(std::memory_order_seq_cst);
000000013FE51A63 mov eax,dword ptr [a]
000000013FE51A67 nop word ptr [rax+rax]
000000013FE51A70 mov ecx,eax
000000013FE51A72 lock cmpxchg dword ptr [a],ecx
000000013FE51A78 jne main+80h (013FE51A70h)
000000013FE51A7A mov dword ptr [temp],eax
反匯編程序MSVS 2012 x86_64 - store() :
a.store(temp, std::memory_order_relaxed);
000000013F8C1A58 mov eax,dword ptr [temp]
000000013F8C1A5C mov dword ptr [a],eax
a.store(temp, std::memory_order_release);
000000013F8C1A60 mov eax,dword ptr [temp]
000000013F8C1A64 mov dword ptr [a],eax
a.store(temp, std::memory_order_seq_cst);
000000013F8C1A68 mov eax,dword ptr [temp]
000000013F8C1A6C xchg eax,dword ptr [a]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.