std::atomic
やなどの関数は引数store
をload
取りstd::memory_order
ます。引数は、他の関数の引数と同様に、実行時に決定できます。ただし、実際の値は、コンパイル中のコードの最適化に影響を与える可能性があります。次の点を考慮してください。
std::atomic<int> ai1, ai2;
int value = whatever;
void foo() {
std::memory_order memOrd = getMemoryOrder();
register int v = value; // load value from memory
ai1.store(v, memOrd); // dependency on v's value
ai2.store(1, memOrd); // no dependency. could this be move up?
}
である場合memOrd
、memory_order_relaxed
2 番目の店舗は最初の店舗の前に安全に移動できます。これにより、読み込みと使用の間に余分な作業が追加さvalue
れ、それ以外の場合に必要なストールが防止される可能性があります。ただし、memOrd
isの場合memory_order_seq_cst
、ストアの切り替えは許可されません。これは、 is が 1 に設定されている場合に、他のスレッドがai1
すでに に設定されていると見なす可能性があるためです。value
ai2
私が疑問に思っているのは、メモリの順序がコンパイル時ではなくランタイム引数として定義された理由です。最適なメモリ操作のセマンティクスを決定する前に、誰かが実行時に環境を調べる理由はありますか?