21

acquire operationC ++ 11標準では、セクション1.10 / 5で言及されていますが、用語、、、release operationおよびを正式に定義していませんconsume operation。次に、セクション29で、これらの用語を使用して、特定のメモリ順序、不可分操作、およびメモリフェンスのアクションを説明します。たとえば、「順序と一貫性」の29.3/1は次のように述べています。

memory_order_releasememory_order_acq_rel、およびmemory_order_seq_cst:ストア操作は、影響を受けるメモリ位置に対してリリース操作[強調追加]を実行します。

このタイプの言語はセクション29全体で繰り返されますが、memory_order列挙のすべての意味が、標準では形式化されていないように見える操作タイプに基づいているのに、一般的に合意された意味を持っている必要があるのは少し気になります定義として有効であるため。

別の言い方をすれば、「バーは反転したfooです」と言った場合、どちらの用語も正式に定​​義されていないため、barfooの具体的な意味はあいまいです。それらの相対的な性質のみが定義されています。

C ++ 11標準、またはその他のC ++ 11標準委員会の文書は、、などが正確に何であるかを正式に定義していますかacquire operationrelease operationそれともこれらは単に一般的に理解されている用語ですか?後者の場合、これらの操作の意味について業界標準と見なされる優れたリファレンスはありますか?ハードウェアメモリの整合性モデルは同じように作成されていないため、具体的に質問します。したがって、実装コンパイラなどがこれらの操作のセマンティクスをネイティブアセンブリコマンドに適切に変換できるようにする、一般的に合意されたリファレンスが必要だと考えています。

4

4 に答える 4

6

注の1つに、非公式に要約された定義があります。

でリリース操作を実行するAと、他のメモリ位置に対する以前の副作用が、後で消費または取得操作を実行する他のスレッドから見えるようになりますA

それに加えて、取得および解放操作の動作は、1.10で完全に定義されています。具体的には、それらが発生前の関係にどのように寄与するかです。振る舞い以外の定義は役に立たない。

于 2012-05-10T02:52:10.247 に答える
3

標準をざっと見ても、取得/解放のセマンティクスの正式な定義は見当たらないので、一般的に理解されている用語であると想定されていると思います。

結局のところ、彼らはすべてを定義することはできません。

これは決定的なリファレンスではありませんが、RaymondChenが取得/リリースのセマンティクスについてブログに書いています。彼の投稿には、Microsoftの取得および解放セマンティクスの定義へのリンクが含まれています。これも役立つ場合があります。

于 2012-05-10T02:30:25.777 に答える
3

実際、これらの操作はセクション1.10/5-12で定義されています。

release/acquireペアは関係の前に起こることに対応します。release/consume依存関係とペアになっている間-関係の前に順序付けられます。

于 2012-05-10T02:48:54.670 に答える
0

また、取得/解放のセマンティクスは、それ自体でかなり明確であると考えています。歴史的にはプログラミング用語というよりもハードウェア固有の用語ですが。

しかし、セクション1.10の5項と6項は、CPU定義だけでなく、他の言語標準で読んだすべての取得/解放セマンティクス定義と一致しているようだと思います。

とにかく、C ++ 11の主要なポイントの1つは、並行およびマルチスレッドコードをサポートする最新のメモリモデルを定義することでした。彼らがそれを正しく理解しなかったとは信じがたいです:)

于 2012-05-10T02:38:30.270 に答える