問題タブ [memory-barriers]
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# - ロックステートメントによるメモリバリア
最近、メモリバリアと並べ替えの問題について読みましたが、今では混乱しています。
次のシナリオを検討してください。
Update
メソッドで; プロパティを取得または設定する前に、_usingMethod1 = true
ステートメントは常に実行されますか?または再注文の問題により、それを保証することはできませんか?私たちは
/li>volatile
のように使用する必要がありますcanを使用
/li>lock;
すると、ロック内のすべてのステートメントが次のような順序で実行されることが保証されます。
concurrency - メモリバリアとインターロック操作
私はメモリバリアの理解を深めようとしています。弱いメモリモデルがあり、デッカーのアルゴリズムを適応させたとします。メモリバリアを追加することで、弱いメモリモデルで正しく動作させることは可能ですか?
答えは意外とノーだと思います。その理由は(私が正しければ)、メモリバリアを使用して読み取りが別の読み取りを超えないようにすることはできますが、読み取りが古いデータ(キャッシュ内のデータなど)を認識しないようにすることはできないためです。したがって、クリティカルセクションが(CPUのキャッシュごとに)ロック解除された過去のある時点を確認できましたが、現時点では、他のプロセッサがそれをロックされていると見なす可能性があります。私の理解が正しければ、複数のプロセッサ間でメモリ位置の値が同期して一致するように、一般にテストアンドセットまたはコンペアアンドスワップと呼ばれる操作を使用する必要があります。
したがって、弱いメモリモデルシステムがメモリバリアのみを提供することはないと正しく期待できますか?システムが有用であるためには、テストアンドセットやコンペアアンドスワップなどの操作を提供する必要があります。
x86を含む一般的なプロセッサは、弱いメモリモデルよりもはるかに強力なメモリモデルを提供していることを認識しています。弱いメモリモデルに焦点を当てて議論してください。
(デッカーのアルゴリズムが適切でない場合は、可能であれば、メモリバリアが正しい同期を正常に達成できる別の相互排除アルゴリズムを選択してください。)
assembly - 順序と障壁:PowerPCの「lwsync」に対するx86の同等の命令は何ですか?
私のコードは以下のように単純です。読み取りと書き込み用のrmbとwmbを見つけましたが、一般的なものは見つかりませんでした。lwsyncはPowerPCで利用できますが、x86の代わりとなるものは何ですか?よろしくお願いします。
c# - なぜメモリバリアが必要なのですか?
C# 4 の概要 (強くお勧めします) では、次のコードを使用して MemoryBarrier の概念を示します (A と B が異なるスレッドで実行されたと仮定します)。
彼らは、バリア 1 と 4 がこの例が 0 を書き込むのを防ぎ、バリア 2 と 3 が新鮮さを保証することを述べています。B が A の後に実行された場合、読み取り_completeがtrueと評価されることを保証します。
私は本当にそれを得ていません。バリア 1 と 4 が必要な理由を理解していると思います: _answer への書き込みを最適化して_completeへの書き込みの後に配置することは望ましくなく(バリア 1)、_answer がキャッシュされないようにする必要があります(バリア 4) 。 . また、バリア 3 が必要な理由も理解していると思います。A が_complete = trueを書き込んだ直後まで実行された場合、B は正しい値を読み取るために_completeを更新する必要があります。
なぜバリア 2 が必要なのかわかりません。私の一部は、おそらくスレッド 2 (B を実行中) がすでにif(_complete)まで実行されていたため (ただし、含まれていないため)、 _completeが更新さ れていることを確認する必要があると言っています。
ただし、これがどのように役立つかわかりません。A で_completeが true に設定されていても、B メソッドでは_completeのキャッシュ (false) バージョンが表示される可能性はありませんか? つまり、スレッド 2 が最初の MemoryBarrier の後までメソッド B を実行し、次にスレッド 1 がメソッド A を_complete = trueまで実行し、それ以上実行せず、スレッド 1 が再開してif(_complete)をテストした場合、そうでない場合はfalseになりますか?
c# - Thread.MemoryBarrier() が必要な理由
"C# 4 in a Nutshell" で、著者は、このクラスが 0 なしで書き込めることがあることを示していますがMemoryBarrier
、私の Core2Duo では再現できません。
この必要性は私にはクレイジーに思えます。これが発生する可能性のあるすべてのケースをどのように認識できますか? プロセッサが操作の順序を変更した場合、動作が変わらないことを保証する必要があると思います。
わざわざバリアを使用しますか?
multithreading - C ++のメモリフェンス/バリア:ブーストまたは他のライブラリにはそれらがありますか?
最近、マルチスレッド コードを同期し、コードの並べ替えを回避する方法として、メモリ フェンスとバリアについて読んでいます。
私は通常、Linux OS の下で C++ で開発を行っており、boost
ライブラリを大量に使用していますが、それに関連するクラスを見つけることができません。フェンスのメモリバリアがブーストに存在するかどうか、または同じ概念を実現する方法があるかどうか知っていますか? そうでない場合、どの良いライブラリを見ることができますか?
assembly - x86の書き込みバリアとして優れているのはどれですか:lock + addlまたはxchgl?
Linuxカーネルはlock; addl $0,0(%%esp)
書き込みバリアとして使用し、RE2ライブラリはxchgl (%0),%0
書き込みバリアとして使用します。違いは何ですか?どちらが良いですか?
x86には読み取りバリア命令も必要ですか?RE2は、読み取りバリア機能をx86でのno-opとして定義しますが、Linuxは、lfence
SSE2が使用可能かどうかに応じて、読み取りバリア機能をno-opまたはno-opとして定義します。いつlfence
必要ですか?
c# - C# の Volatile と Thread.MemoryBarrier
マルチスレッド アプリケーション用のロック フリー コードを実装するために、私はvolatile
変数
を使用しました。したがって、スレッドが変数値を更新し、その更新が行われた直後にスレッドがその変数を読み取ると、スレッド A から最近書き込まれた最新の値が表示されます。volatile
A
B
volatile を適用しても、書き込みとそれに続く読み取りがスワップされるのを防ぐことはできません。
この問題は、変数をThread.MemoryBarrier()
取得する前に次のように配置することで解決できますか?volatile
そして、これで問題が解決した場合。条件の 1 つでその値に依存する while ループがあるとします。Thread.MemoryBarrier()
whileループの前に置くことは問題を解決する正しい方法ですか? 例:
より正確に言うと_foo
、スレッドがいつでも変数を要求したときに、変数が最も新しい値を与えるようにします。したがってThread.MemoryBarrier()
、変数を呼び出す前に挿入すると問題が解決する場合は、Foo
代わりにプロパティを使用して、そのプロパティの取得内で_foo
実行できます。Thread.MemoryBarrier()
language-agnostic - 同期、先行発生関係、および取得と解放のセマンティクス
同期との関係を理解するのに助けが必要です。理解しようとしている例を読めば読むほど、何も理解していないと感じます。時々、これだ、わかった、と感じることがありますが、別の例を見ると、また混乱してしまいます。それを正しくするのを手伝ってください。
操作 A が操作 B と同期するのは、A が解放セマンティクスを使用したアトミック変数 m へのストアであり、B が取得セマンティクスを使用した同じ変数 m からのロードであり、B が A によって格納された値を読み取る場合です。また、次の場合、操作 A は操作 B の前に発生するとも言います。
- A が B と同じスレッドで実行され、A がプログラム順序で B の前にある、または
- A が B と同期する、または
- A は他の操作 C の前に発生し、C は B の前に発生します
わかった。この例を見ると
thread0 実行 | スレッド1が実行します
x ストア (リリース) | x をロード (取得)
x here へのストアは、x からのロードと同期しますか? ここで同期との関係がある場合、x へのストアは x からのロードの前に発生するため、スレッド 0 で x へのストアの前にシーケンス処理されたものはすべて、スレッド 1 の x からのロードの前に発生します。これは、ここで強制的な順序付けがあることを意味します。そうですか?しかし、この場合、定義の「およびBがAによって格納された値を読み取る」部分が何を意味するのかわかりませんか? スレッド 1 がスレッド 0 よりも速い場合、古い値を読み取る可能性があります。では、ここでの関係はどのようなもので、何か関係があるのでしょうか? 存在しない場合、どうすればその関係を提供できますか?
前もって感謝します。
c++ - _mm_sfence _mm_lfence と _mm_mfence をいつ使用する必要がありますか?
「Intel 最適化ガイド Guide For Intel Architecture」を読みました。
ただし、いつ使用するかについてはまだわかりません
マルチスレッド コードを記述するときにこれらをいつ使用する必要があるか、誰か説明できますか?