11

私は n3485 で定義された C++ メモリ モデルを読んでいます。これは、私が理解していることと、このブログで提供されている定義から解放/取得セマンティクスについて語っています。

取得セマンティクスは、読み取り-変更-書き込み操作であろうと単純なロードであろうと、共有メモリから読み取る操作にのみ適用できるプロパティです。この操作は読み取り取得と見なされます。取得セマンティクスは、プログラム順でそれに続く読み取りまたは書き込み操作での読み取り/取得のメモリの並べ替えを防止します。

リリース セマンティクスは、共有メモリに書き込む操作にのみ適用できるプロパティであり、それらが読み取り-変更-書き込み操作であるかプレーン ストアであるかに関係ありません。この操作は、書き込み解放と見なされます。解放セマンティクスは、プログラム順で先行する読み取りまたは書き込み操作による書き込み解放のメモリの並べ替えを防ぎます。

現在の読み取り/書き込みが行われる前または後の読み取り/書き込みの並べ替えを防止します。最初の (取得) は、現在行われている読み取りがその後の読み取り/書き込みで並べ替えられていないことを確認し、後者 (リリース) は、現在の書き込みが前の読み取り/書き込み操作で並べ替えられていないことを確認します。それ。

はセマンティクスを取得し、本質的に解放std::mutex::lockセマンティクスを持っていると言えますか?std::mutex::unlock

標準では、セクションの下でこれを見つけることができます

30.4.1.2 ミューテックス型 [thread.mutex.requirements.mutex]

unlock()11 同期:同じオブジェクトに対する以前の操作は、 (1.10) この操作と同期する必要があります。

私が理解していることから、同期は標準で明示的に定義されていませんが、 2つの異なるスレッド間で評価される2つのステートメントを見ると、関係の前に発生するタイプのようですが、取得/解放セマンティクスの私の理解から、これにはもっと多くのことがありますメモリの並べ替えに関係します。 同期はリリース/取得セマンティクスとも呼ばれますか?

リリース/取得セマンティクスは、ロード/ストア操作の並べ替えだけでなく、操作のスレッド内インターリーブにも適用されますか?

メモリモデルに関する標準的なセクションでは、主に 2 つのスレッドのインターリーブに関する順序付けられた関係について説明しています。これがメモリの順序付けにも適用されるかどうかについては、解釈の余地があります。

誰でも明確にできますか?

4

1 に答える 1

7

std::mutex::lock には取得セマンティクスがあり、std::mutex::unlock には本質的に解放セマンティクスがあると言えますか?

はい、これは正しいです。

私が理解していることから、同期は標準で明示的に定義されていません

まあ、理論的には、パラグラフ 1.10/8 はおそらく同期の定義を与えることを意図しています:

特定のライブラリ呼び出しは、別のスレッドによって実行される他のライブラリ呼び出しと同期します。たとえば、アトミックな store-releaseは、ストアから値を取得する load-acquire と同期します (29.3)。[ノート: ...]

一方、これは非常に正式な定義のようには聞こえません。ただし、暗黙的ではありますが、パラグラフ 1.10/10 で間接的に指定されています。

次の場合、評価 A は評価 B の前に依存順序付けされます。

— A がアトミック オブジェクト M に対して解放操作を実行し、別のスレッドで B が M に対して消費操作を実行し、A が先頭に立つ解放シーケンスの副作用によって書き込まれた値を読み取る、または

— 一部の評価 X では、A は X の前に依存関係の順序で並べられ、X は B への依存関係を持ちます。

[ 注: 「前に依存関係が順序付けられている」という関係は「同期する」に似ていますが、解放/取得の代わりに解放/消費を使用します。—終わりのメモ]

と類似している」関係はほとんどの場合対称的であるため、上記の「is-dependency-ordered before」の定義は間接的に「synchronizes with」の定義も提供していると言えます。 -規範; それでも、これは意図した定義のようです。

同期関係の私の直感は、特定の値を格納する 1 つのスレッドによって実行される書き込み (アトミック) 操作と、その値を読み取る最初の(アトミック) 操作の間に発生するということです。その操作は同じスレッドにある可能性もあります。

2 つの操作が異なるスレッド上にある場合は、synchronizes-with関係によって操作のクロススレッド順序が確立されます。

標準では、セクションの下でこれを見つけることができます

30.4.1.2 ミューテックス型 [thread.mutex.requirements.mutex]

unlock()11 同期:同じオブジェクトに対する以前の操作は、 (1.10) この操作と同期する必要があります。

私には、これは上記の解釈と互換性があるようです。解放セマンティクス (ロック解除、保存) を伴う操作は、取得セマンティクス (ロック、ロード) の操作と同期します。

ただし、取得/解放のセマンティクスに関する私の理解からすると、これはメモリの並べ替えと関係があります。同期はリリース/取得セマンティクスとも呼ばれますか?

解放と取得のセマンティクスは、一部の操作の性質を記述します。synchronizes-with関係は、(実際)明確に定義された方法でセマンティクスを取得または解放する操作間で確立される関係です。

したがって、ある意味では、synchronizes-withはこれらの操作のセマンティクスの結果であり、これらのセマンティクスを使用して、命令の正しい順序付けを実現し、CPU またはコンパイラが実行する可能性のある並べ替えを制限します。

于 2013-03-09T17:50:59.590 に答える