問題タブ [memory-model]

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.

0 投票する
1 に答える
224 参照

synchronization - スレッド同期: 書き込みの可視性を保証する方法

ソフトウェアとハ​​ードウェアのメモリ モデル、メモリ フェンス、ストア/ロードの再順序付けなどに関する情報はすでにたくさんあります。ただし、共有メモリに対する読み取りと書き込みの相対的な順序を保証することに焦点を当てているようです。

そのようなシステムがスレッドの書き込みを潜在的に長い時間遅らせることは合法的な振る舞いでしょうか?

たとえば、メモリ内のデータ構造を更新し、他のスレッドに更新を通知するフラグを立てるスレッドを考えてみましょう。

私が読んだほとんどのメモリ モデルによると、メモリ バリアは、古い値 1、2、または 3 を読み取っている間、他のスレッドが dataWritten を true として監視できないことを保証します。つまり、これらの書き込みをアトミックにします。

しかし、書き込みがまったく見られると確信できますか? フラグが値よりも早く書き込まれない限り、メモリ モデルの下で書き込みを無期限に遅らせることは合法でしょうか?

データベース用語では、メモリ モデルを使用して耐久性を判断できますか (上記の例のようにメモリ フェンスとフラグを使用して保証できるアトミック性と一貫性に加えて)。

更新: 可視性の適時性に関する volatile の詳細なセマンティクスは、Java メモリ モデルとメモリ モデルの順序と可視性のコンテキストで同じトピックを扱いますか? C++11 用。その議論はハードウェア メモリ モデルにも適用されますか。つまり、CPU ISA は正しい可視性シーケンスをハードに保証するだけで、遅延可視性を「ソフト」に保証しますか?

0 投票する
1 に答える
188 参照

c++ - 出版物の安全性、リラックスしたメモリモデルとmemcpy

出版物の安全性に関するセクションのこの記事に従おうとしています。私の場合は、記事の些細な例と同じですが、「公開された」データは単一の値ではなく、の複数のフィールドstructです。出版社は各フィールドを個別に書き込むので、各書き込みをストアでmemory_order_releaseまとめることで問題ありません。

消費者はまずmemory_order_acquire、データの準備ができていることを確認します。次に、を使用しmemcpyて公開された全体を別の場所にコピーしたいのstructですが(既存のコードの残りの部分によりよく適合するため)、メモリモデルを指定できないため、これは安全ではないようです。これは単なる妄想ですか、それとも深刻な問題になる可能性がありますか?

amd64/x86に固有の提案を受け入れました。

0 投票する
2 に答える
261 参照

java - java.lang.Class.newInstance0() が Java メモリ モデルで厳密に正しくないのはなぜですか?

java.lang.Class.newInstance0()JDK 1.7 Update 7 で次の注意事項を見つけました。

注: 次のコードは、現在の Java メモリ モデルでは厳密には正しくない可能性があります。

誰でも理由を説明できますか?

0 投票する
2 に答える
818 参照

java - ダブルチェックの問題は1.6または1.7で修正されていますか?

1.4でダブルチェックの問題が 発生しましたhttp://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 後のJDKで修正されましたか?

0 投票する
3 に答える
696 参照

c++ - std::atomic 関数のランタイム引数として memory_order が与えられるのはなぜですか?

std::atomicやなどの関数は引数storeload取りstd::memory_orderます。引数は、他の関数の引数と同様に、実行時に決定できます。ただし、実際の値は、コンパイル中のコードの最適化に影響を与える可能性があります。次の点を考慮してください。

である場合memOrdmemory_order_relaxed2 番目の店舗は最初の店舗の前に安全に移動できます。これにより、読み込みと使用の間に余分な作業が追加さvalueれ、それ以外の場合に必要なストールが防止される可能性があります。ただし、memOrdisの場合memory_order_seq_cst、ストアの切り替えは許可されません。これは、 is が 1 に設定されている場合に、他のスレッドがai1すでに に設定されていると見なす可能性があるためです。valueai2

私が疑問に思っているのは、メモリの順序がコンパイル時ではなくランタイム引数として定義された理由です。最適なメモリ操作のセマンティクスを決定する前に、誰かが実行時に環境を調べる理由はありますか?

0 投票する
1 に答える
182 参照

java - この命令の並べ替えはJLSで許可されていますか?

Java言語仕様(例17.4-1)によると、次のスニペット(で始まるA == B == 0)...

...結果としてr2 == 2とになる可能性がありr1 == 1ます。これは、実行の結果が実行B = 1;されたかどうかに依存しないr2 = Aため、JVMはこれら2つの命令の実行順序を自由に入れ替えることができるためです。つまり、仕様では次のインターリーブが許可されています。

これは明らかにとにr2 == 1なりr1 == 1ます。

私の質問:

例を少し微調整するとします。

ここobjで、はスレッド間で共有される参照です。

の並べ替えは引き続き許可されますかr2 = AB = 1


JLSは言う...

ただし、コンパイラーは、どちらかのスレッドの命令を並べ替えることができます。これが、そのスレッドの単独での実行に影響を与えない場合です。

...これは、命令まだスワップされている可能性があることを示しています。一方、次のステートメント

モニターのロック解除が発生します-そのモニターの後続のすべてのロックの前に。

特定のスケジューリングでは、2つのスレッドのステートメント間に発生前の関係がある可能性があることを示します。これにより、おそらく命令の並べ替えが許可されなくなります。

0 投票する
3 に答える
467 参照

c# - c# メモリ モデル、ロック、および同期化

c# メモリ モデルは、ロックを保持しているスレッドが、他のスレッドが以前に同じロックを保持していたときに実行されたすべての更新を確認できることを保証しますか?

私はC#の仕様を読んでいますが、これに関する詳細を見つけることができません。

0 投票する
1 に答える
360 参照

c - カーネル空間からデータセグメントにアクセスする

プロセスに属するページテーブルのどのページがデータセグメントとして使用されているかを知りたいのですが。amd64にLinuxカーネルv3.2を使用しています

これが私が以前にしたことと機能しなかったことです:

  1. を使用してデータセグメントにアクセスしますtask->mm->start_data(taskはターゲットプロセスのtask_structです)。

  2. task->mm->mmap(リンクリスト)を検索し、各vm_area_structvm_start)の開始アドレスを。と比較しtask->mm->start_dataます。ここでは、データセグメントの先頭がページの先頭に揃えられていると仮定しています。

これはすべて、カーネルモジュール内で実行する必要があります。

ありがとう。

0 投票する
3 に答える
1368 参照

c++ - C++ memory_order_consume、kill_dependency、依存関係の順序付け前、同期先

Anthony Williams によるC++ Concurrency in Actionを読んでいます。現在、私は彼がmemory_order_consumeについて説明している時点で.

そのブロックの後にあります:

メモリの順序付けの基本について説明したので、次はより複雑な部分を見ていきます。

私はいくつかのことを完全には理解していないので、少し怖いです:


dependency-ordered-before とsynchronizes-with の違いは? どちらも事前発生関係を作成します。正確な違いは何ですか?


次の例について混乱しています:

kill_dependency は正確に何をしますか? それはどの依存関係を殺しますか?どのエンティティ間で? そして、コンパイラはその知識をどのように活用できるのでしょうか?


memory_order_consume のすべての発生を安全に memory_order_acquire に置き換えることができますか? つまり、あらゆる意味でより厳格ですか?


リスト 5.9 で、安全に置き換えることができますか?

? つまり、取得と解放を使用して、非アトミック データへのアクセスを同期できますか?


彼は、キュービクルにいる男性を例に、リラックス、取得、解放について説明しています。seq_cst と consumer の同様の簡単な説明はありますか?