それが成功するまで、あなたがループ内でCASを呼び出していませんので、あなたがTryLock
にLock
の名前を変更する可能性があるがはい、それは、スレッドセーフです。伝統的にLock
操作は、取得が成功するまでブロックされると考えられます。 volatile
に関して
、std::atomic
のthe docsは(=
オペレータについて)を指定:
アトミックアトミック変数に値tを割り当てます。店舗に相当する(希望)。そして
約store
:
ボイドストア(T、所望の、memory_order = STD :: memory_order_seq_cst)。
その後についてmemory_order = std::memory_order_seq_cst
:
- いいえライター・スレッドに書き込みはありませんが、読者のスレッドに読み込む
- がアトミック負荷の前に並べ替えることができ、原子 ストアの後に並べ替えることができます。
- 同期は、std :: memory_order_seq_cstタグのすべてのアトミック操作間で確立されます。そのような原子番号 操作を使用するすべてのスレッドは、同じメモリアクセス順序を参照します。
だから、volatile
は必要ありません。また、volatile
は(実際には、volatile
はC++でほとんど役に立たない)上記のものよりも弱い保証があります。
実行のスレッド内では、すべての 揮発性のオブジェクトができないことが保証されているに(読み取りおよび書き込み)アクセス揮発性アクセスはスレッド間で の同期を確立しないため、 otherに対して再順序付けされますが、この順序は別の スレッドによって観測されることが保証されません。
これはおもちゃのコードなので、実際のアプリケーションでは使用しないでください。適切なロックと比較してパフォーマンスはひどくなります。 (単なる一例として、他のスレッドが得られず、 'lock'を呼び出すスレッドがロックを保持するスレッドと同じ物理的なコアで実行されている場合) –