2

新しく導入されたスレッド同期プリミティブを使用して緩和されたメモリ順序を利用する C++11 コードを記述する場合、通常、次のいずれかが表示されます。

std::atomic<int> vv;
int i = vv.load(std::memory_order_acquire);

また

vv.store(42, std::memory_order_release);

なぜこれが理にかなっているのかは私には明らかです。

私の質問は次のとおりです。組み合わせも意味がvv.store(42, std::memory_order_acquire)ありますか? vv.load(std::memory_order_release)どのような状況でそれらを使用できますか? これらの組み合わせのセマンティクスは何ですか?

4

4 に答える 4

5

それは単に許可されていません。C++ (11) 標準には、ロード/ストア操作に適用できるメモリ順序の制約に関する要件があります。

ロードの場合 (§29.6.5):

必須: order 引数は、memory_order_releasenor であってはなりませんmemory_order_acq_rel

ストアの場合:

必須: order 引数はmemory_order_consumememory_order_acquire、または であってはなりませんmemory_order_acq_rel

于 2013-12-05T12:02:15.633 に答える
3

これらの組み合わせは意味がなく、許可されていません。

取得操作は、以前の非アトミックな書き込みまたは副作用を解放操作と同期するため、取得 (ロード) が実現されると、解放 (ストア) の前に発生した他のすべてのストア (効果) も表示されます(リリースされたのと同じアトミック)。

では、ストアの取得とロードのリリースを実行できる(そして実行する) としたら、何をすべきでしょうか? 取得操作はどのストアと同期する必要がありますか? 自体?

于 2013-12-05T12:06:29.507 に答える