これが新しい問題ではないことはわかっていますが、C++11 メモリ フェンスについて読んだ後、混乱しました。
1 つのリーダー スレッドと 1 つのライター スレッドがあるとします。
普通に使えますint
か?
int x = 0; // global
writer reader
x = 1; printf("%d\n", x);
この動作は未定義ですか?
リーダー スレッドで未定義の値を取得できますか? または、 or ?
を使用するようなものです。したがって、値は最終的にリーダースレッドに到達します。std::atomic_uint_fast32_t
std::atomic<int>
std::atomic<int x = 0; // global
writer reader
x.store(1, std::memory_order_relaxed); printf("%d\n", x.load(std::memory_order_relaxed));
答えは使用しているプラットフォームによって異なりますか? (たとえばx86)、通常のロード/ストアint
は1つのCPU命令ですか?
両方の動作が似ている場合、両方のタイプで同じパフォーマンスを期待できますか?