3

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));
}
4

1 に答える 1