問題タブ [memory-fences]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++11 - C11 および C++11 アトミック: 取得と解放のセマンティクスとメモリ バリア
C11* アトミックを使用して、いくつかのスレッド間で状態列挙を管理しています。コードは次のようになります。
これは (ARM Cortex-M4 の場合) 次のようにアセンブルします。
リリース前と取得後にフェンスが配置されるのはなぜですか? 私のメンタル モデルでは、リリースの後(格納されている変数と他のすべてのストアを他のスレッドに "伝達" するため)、および取得の前(他のスレッドから以前のすべてのストアを受け取るため) にバリアが配置されると想定していました。
*この特定の例は C11 で示されていますが、C++11 でも状況は同じです。メモリの順序付けに関しては、2 つが同じ概念 (さらには同じ列挙型) を共有しているためです。この状況で同じマシンコードを発行しますgcc
。http://en.cppreference.com/w/c/atomic/memory_orderおよびhttp://en.cppreference.com/w/cpp/atomic/memory_orderg++
を参照してください。
multithreading - フェンスを使用して他のスレッドのデータ更新の可視性を確保する
2 つの質問があります。1 つは共有データを変更し、もう 1 つは共有データを操作する 2 つのスレッドについて考えてみましょう。どちらのスレッドも、データを処理する前にミューテックスを取得します。
データを操作するスレッドが、最初のスレッドによって行われた変更を常に確認できるようにするにはどうすればよいですか? 一連の取得/解放フェンスが必要ですか、それともミューテックスを使用してスレッドを暗黙的に同期しますか? ミューテックスを使用しない場合 (ただし、排他的アクセスを保証する場合) はどうなりますか?
そして:フェンスは、インターリーブ/フォローアップのアトミック操作なしで実際に何かをしますか(atomic_boolにフラグを格納する、「準備完了」などを通知するなど)?
ユースケースは次のとおりです。
c++ - フェンスは実際にC ++でどのように機能しますか
フェンスが実際にコードの同期を強制する方法を理解するのに苦労しています。
たとえば、このコードがあるとします
リリース フェンスの後にアトミック ストア操作が続き、取得フェンスの前にアトミック ロードがあるため、すべてが想定どおりに同期され、アサートは発生しません。
しかし、yがこのようなアトミック変数ではなかった場合
その場合、データ競合が発生する可能性があると聞きました。しかし、それはなぜですか?コードを適切に同期させるために、リリース フェンスの後にアトミック ストアが続き、取得フェンスの前にアトミック ロードが必要なのはなぜですか?
また、データ競合によってアサートが発生する実行シナリオを誰かが提供できれば幸いです
java - sun.misc.Unsafe を使用せずに完全なメモリ フェンスをトリガーする方法は?
を使用せずに完全なメモリ フェンスをトリガーすることに興味がありsun.misc.Unsafe
ます。
次の Java コードはフル メモリ フェンスをトリガーしますか?
次の Java コードもフル メモリ フェンスをトリガーしますか?
c++ - OpenMP のアトミックおよび非アトミック読み取り/書き込みは、x86_64 で同じ命令を生成します
OpenMP 仕様 (v4.0) によると、次のプログラムには、非同期の読み取り/書き込みによるデータ競合の可能性が含まれていますi
。
私の頭に浮かんだ可能な解決策は、コメントとしてコードに示されています。
- の書き込みと読み取りを保護するに
i
は#pragma omp atomic write/read
、 - の書き込みと読み取りを保護するに
i
は#pragma omp atomic write/read seq_cst
、 - のタイプとしての
std::atomic<int>
代わりに使用します。int
i
x86_64 でコンパイラが生成した命令を次に示します (-O2
すべての場合)。
#pragma omp atomic
私が疑問に思っているのは、GNU/clang コンパイラが書き込み用の特別な命令を生成しない理由です。と同様の指示std::atomic
、つまり または のいずれかMOV+MFENCE
を期待しますXCHG
。説明はありますか?
アップデート
g++ 5.3.0 はMFENCE
for を生成し#pragma omp atomic write seq_cst
ます。それが正しい振る舞いだと私は信じています。がなければ、非 SC 原子性には十分なseq_cst
plain が生成されます。MOV
私の Makefile にはバグがあり、g++ 4.9.2 はMFENCE
CS アトミック書き込み用にも生成されます。申し訳ありません。
Clang 3.5.0 は OpenMP SC アトミックを実装していません。これを指摘してくれた Hristo Iliev に感謝します。
c++ - 1 つのリーダー、1 つのライター、int または atomic_int
これが新しい問題ではないことはわかっていますが、C++11 メモリ フェンスについて読んだ後、混乱しました。
1 つのリーダー スレッドと 1 つのライター スレッドがあるとします。
普通に使えますint
か?
この動作は未定義ですか?
リーダー スレッドで未定義の値を取得できますか? または、 or ?
を使用するようなものです。したがって、値は最終的にリーダースレッドに到達します。std::atomic_uint_fast32_t
std::atomic<int>
答えは使用しているプラットフォームによって異なりますか? (たとえばx86)、通常のロード/ストアint
は1つのCPU命令ですか?
両方の動作が似ている場合、両方のタイプで同じパフォーマンスを期待できますか?
c# - メモリバリアはC#での新しい読み取りを保証しますか?
C# に次のコードがあるとします。
MemoryBarriers
書き込み命令が読み取りの前に行われることを確認してください。ただし、あるスレッドの書き込みが他のスレッドの読み取りによって認識されることが保証されていますか? 言い換えれば、少なくとも 1 つのスレッドが印刷される、1
または両方のスレッドが印刷されることが保証されているの0
でしょうか?
thisやthisのように、「鮮度」やMemoryBarrier
C# に関連するいくつかの質問が既に存在することを知っています。ただし、それらのほとんどは、書き込み解放および読み取り取得パターンを扱っています。この質問に投稿されたコードは、命令が順番に保持されているという事実に加えて、読み取りによって書き込みが表示されることが保証されているかどうかに非常に固有のものです。