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_relaxed2 番目の店舗は最初の店舗の前に安全に移動できます。これにより、読み込みと使用の間に余分な作業が追加さvalueれ、それ以外の場合に必要なストールが防止される可能性があります。ただし、memOrdisの場合memory_order_seq_cst、ストアの切り替えは許可されません。これは、 is が 1 に設定されている場合に、他のスレッドがai1すでに に設定されていると見なす可能性があるためです。valueai2
私が疑問に思っているのは、メモリの順序がコンパイル時ではなくランタイム引数として定義された理由です。最適なメモリ操作のセマンティクスを決定する前に、誰かが実行時に環境を調べる理由はありますか?