memory_order_acquire を使用してロードを実行している 2 つのスレッドと、memory_acquire_release を使用してストアを実行している 1 つのスレッドがある場合、ロードは、ロードを実行している 2 つのスレッドのうちの 1 つとのみ同期されますか? つまり、ストア/ロードのスレッドの1つとしか同期できないか、ストアを実行する単一のスレッドで同期ロードを実行する複数のスレッドを持つことができます。1 対 1 の関係であると調査した結果、これが当てはまるようですが、読み取り-変更-書き込み操作は連鎖しているようです。以下を参照してください。
スレッドが fetch_sub のような read-modify-write 操作を実行している場合、正常に動作しているように見えます。これらは、reader1_thread と reader2_thread の間に同期関係がなくても、チェーン リリースがあるようです。
std::atomic<int> s;
void loader_thread()
{
s.store(1,std::memory_order_release);
}
// seems to chain properly if these were fetch_sub instead of load,
// wondering if just loads will be synchronized as well meaning both threads
// will be synched up with the store in the loader thread or just the first one
void reader1_thread()
{
while(!s.load(std::memory_order_acquire));
}
void reader2_thread()
{
while(!s.load(std::memory_order_acquire));
}