答えが見つからないのは、(a)速く、(b)持ち運びできるようにする方法がないからです。それは依存しています:C + +またはC、コンパイラ、コンパイラのバージョン、コンパイラの設定、ライブラリ、アーキテクチャ...リストは続けています。ここで
は出発点である:
私は、CASが合理的な代替方法である理由を説明するかもしれないアセンブラコードのスニペットを持っていることがあります。あなたの計画は(2)ミューテックスを使用するための正しい
volatile long debug_x64_i = std::atomic_load((const std::_Atomic_long *)&my_uint32_t_var);
00000001401A6955 mov eax,dword ptr [rbp+30h]
00000001401A6958 xor edi,edi
00000001401A695A mov dword ptr [rbp-0Ch],eax
debug_x64_i = _InterlockedCompareExchange((long*)&my_uint32_t_var, 0, 0);
00000001401A695D xor eax,eax
00000001401A695F lock cmpxchg dword ptr [rbp+30h],edi
00000001401A6964 mov dword ptr [rbp-0Ch],eax
debug_x64_i = _InterlockedOr((long*)&my_uint32_t_var, 0);
00000001401A6967 prefetchw [rbp+30h]
00000001401A696B mov eax,dword ptr [rbp+30h]
00000001401A696E xchg ax,ax
00000001401A6970 mov ecx,eax
00000001401A6972 lock cmpxchg dword ptr [rbp+30h],ecx
00000001401A6977 jne foo+30h (01401A6970h)
00000001401A6979 mov dword ptr [rbp-0Ch],eax
volatile long release_x64_i = std::atomic_load((const std::_Atomic_long *)&my_uint32_t_var);
00000001401A6955 mov eax,dword ptr [rbp+30h]
release_x64_i = _InterlockedCompareExchange((long*)&my_uint32_t_var, 0, 0);
00000001401A6958 mov dword ptr [rbp-0Ch],eax
00000001401A695B xor edi,edi
00000001401A695D mov eax,dword ptr [rbp-0Ch]
00000001401A6960 xor eax,eax
00000001401A6962 lock cmpxchg dword ptr [rbp+30h],edi
00000001401A6967 mov dword ptr [rbp-0Ch],eax
release_x64_i = _InterlockedOr((long*)&my_uint32_t_var, 0);
00000001401A696A prefetchw [rbp+30h]
00000001401A696E mov eax,dword ptr [rbp+30h]
00000001401A6971 mov ecx,eax
00000001401A6973 lock cmpxchg dword ptr [rbp+30h],ecx
00000001401A6978 jne foo+31h (01401A6971h)
00000001401A697A mov dword ptr [rbp-0Ch],eax
:これはC、I86、マイクロソフトのコンパイラVS2015、Win64の対象となっています。
幸運。
あなたは[''](http://en.cppreference.com/w/cpp/atomic/atomic)を調べましたか? –
CoryKramer
申し訳ありませんが、アトミックヘッダーを使用できないことを示すためにQを更新しました。 – Wad
read-modify-writeを実行している場合は、操作全体がmutex内になければなりません。私が追跡しなければならなかった最悪のバグの1つは、読み込みがミューテックスにあって、その間にそれをリリースできると書かれていたと思った人でした。 – stark