私は n3485 で定義された C++ メモリ モデルを読んでいます。これは、私が理解していることと、このブログで提供されている定義から解放/取得セマンティクスについて語っています。
取得セマンティクスは、読み取り-変更-書き込み操作であろうと単純なロードであろうと、共有メモリから読み取る操作にのみ適用できるプロパティです。この操作は読み取り取得と見なされます。取得セマンティクスは、プログラム順でそれに続く読み取りまたは書き込み操作での読み取り/取得のメモリの並べ替えを防止します。
リリース セマンティクスは、共有メモリに書き込む操作にのみ適用できるプロパティであり、それらが読み取り-変更-書き込み操作であるかプレーン ストアであるかに関係ありません。この操作は、書き込み解放と見なされます。解放セマンティクスは、プログラム順で先行する読み取りまたは書き込み操作による書き込み解放のメモリの並べ替えを防ぎます。
現在の読み取り/書き込みが行われる前または後の読み取り/書き込みの並べ替えを防止します。最初の (取得) は、現在行われている読み取りがその後の読み取り/書き込みで並べ替えられていないことを確認し、後者 (リリース) は、現在の書き込みが前の読み取り/書き込み操作で並べ替えられていないことを確認します。それ。
はセマンティクスを取得し、本質的に解放std::mutex::lock
セマンティクスを持っていると言えますか?std::mutex::unlock
標準では、セクションの下でこれを見つけることができます
30.4.1.2 ミューテックス型 [thread.mutex.requirements.mutex]
unlock()
11 同期:同じオブジェクトに対する以前の操作は、 (1.10) この操作と同期する必要があります。
私が理解していることから、同期は標準で明示的に定義されていませんが、 2つの異なるスレッド間で評価される2つのステートメントを見ると、関係の前に発生するタイプのようですが、取得/解放セマンティクスの私の理解から、これにはもっと多くのことがありますメモリの並べ替えに関係します。 同期はリリース/取得セマンティクスとも呼ばれますか?
リリース/取得セマンティクスは、ロード/ストア操作の並べ替えだけでなく、操作のスレッド内インターリーブにも適用されますか?
メモリモデルに関する標準的なセクションでは、主に 2 つのスレッドのインターリーブに関する順序付けられた関係について説明しています。これがメモリの順序付けにも適用されるかどうかについては、解釈の余地があります。
誰でも明確にできますか?