スレッドAで更新され、他のスレッドで読み取られるメモリ変数があります。リーダーは、値がゼロ以外の場合にのみ気にします。値がインクリメントされると、ゼロに戻らないことが保証されています。以下のように最適化するのは理にかなっていますか?言い換えれば、読者側では、条件が満たされた後は「フェンス」は必要ありません。
std::atomic<int> counter;
writer:
increment()
{
counter.store(counter+1, std:memory_order_release)
}
reader:
iszero()
{
if (counter.load(std::memory_order_relaxed) > 0) return false;
// memory fence only if condition not yet reached
return (counter.load(std::memory_order_acquire) == 0);
}