問題タブ [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.
c++ - 同時実行のための C++03 メモリ モデルとは何ですか?
C++03 での同時実行のメモリ モデルは何ですか?
(そして、C++11 は並行性をより適切にサポートするためにメモリ モデルを変更しますか?)
c - DelphiにはCの揮発性変数に相当するものがありますか?
CおよびC++では、変数をvolatileとしてマークできます。これは、宣言するオブジェクトの外部で変更される可能性があるため、コンパイラーが変数を最適化しないことを意味します。Delphiプログラミングに相当するものはありますか?キーワードでない場合は、おそらく回避策ですか?
私の考えはAbsoluteを使用することでしたが、確信が持てず、他の副作用が発生する可能性があります。
c++ - const_cast は実際のコードの放出を引き起こしますか?
const_castは、コンパイラーに「うめき声をやめ、これを非 const ポインターとして扱う」ように伝える方法にすぎないというのは本当ですか? const_cast自体を実際のマシンコードに変換する場合はありますか?
c# - Interlocked.CompareExchange はメモリ バリアを使用しますか?
Volatile の読み取りと書き込み、および適時性に関する Joe Duffy の投稿を読んでいて、投稿の最後のコード サンプルについて何かを理解しようとしています。
2 番目の CMPXCHG 操作が実行されるとき、メモリ バリアを使用して、m_stateの値が実際に書き込まれた最新の値であることを確認しますか? それとも、プロセッサのキャッシュに既に格納されている値を使用するだけですか? ( m_stateが volatile として宣言されていないと仮定します)。
私の理解が正しければ、CMPXCHG がメモリ バリアを使用しない場合、最初にロックを取得したスレッドがすべてを取得する可能性が高いため、ロック取得手順全体は公平ではありません。次のロックの。私は正しく理解しましたか、それともここで何かを見逃していますか?
編集: 主な問題は、実際に CompareExchange を呼び出すと、m_state の値を読み取ろうとする前にメモリ バリアが発生するかどうかです。そのため、CompareExchange を再度呼び出そうとしたときに、すべてのスレッドに 0 の割り当てが表示されるかどうか。
java - メモリの非一貫性が原因で、スレッドはオブジェクトのジャンク値を観察できますか?
多くの調査の結果、私は JMM を非常によく理解していると思います。オブジェクトが 2 つのスレッド間で共有されている場合、同じモニターですべてのアクセスを同期する必要があることを十分に理解しています。複数のアクティブなスレッドがオブジェクトに同時にアクセスする場合、それらが何を観察するかについてすべての賭けがオフになることを理解しています。
ただし、オブジェクトを使用する他のスレッドが開始される (またはそのスレッドが構築される) 前に、オブジェクトが決定論的かつ実際に構築される場合、JMM は、後のスレッドによって表示されるオブジェクトの内容が、によって構成されたものと同じであることを保証しますか?以前のセットアップ スレッド。
IOW、スレッドで初めてオブジェクトを参照し、オブジェクトの実際の内容ではなく、CPU キャッシュなどによるダーティ メモリを観察することは可能ですか? それとも、JMM は、特定のオブジェクトへの参照を最初に取得するときに、それが参照するメモリが一貫していることを保証しますか?
私がまだ確信が持てない多くの場所で使用する特定のパターンが 1 つあるため、質問します。多くの場合、断片的な方法で構築および構成され、その後不変に使用されるオブジェクトがあります。これは断片的に構成されているため、そのメンバーを最終的なものにすることはできません (必要がない限り、これらすべてをビルダー パターンに変更したくありません)。
たとえば、HTTP 接続ハンドラを作成し、プラグイン オブジェクトを追加して特定の HTTP リクエストを処理します。ハンドラーはミューテーターを使用して作成および構成され、スレッドプールを使用して接続を処理する TCP 接続プロセッサーにインストールされます。接続ハンドラは、接続プロセッサのスレッド プールが開始される前に構成およびインストールされ、一度接続プロセッサにインストールされると決して変更されないため、すべてを設定するスレッドと接続を処理するスレッドとの間で明示的な同期を使用しません。
この特定のケースでは、スレッド構成もスレッドプールを開始する同じスレッドである可能性が高く、スレッドプールの開始が同期されるため、それを実行するすべてのスレッドも同じスレッドプールオブジェクトで同期されるため、これ根本的な問題を隠す可能性があります (私の API では、開始スレッドが構成スレッドと同じである必要はありません)。
c# - メモリバリアと大きな構造体?
100 バイトで構成される構造体があるとします。次のコードについてどのような保証がありますか?
メモリ モデルは、メモリ バリアの配置後に 100 バイトのコピーが完了することを保証しますか? またはメモリバリアは、プロセッサのアーキテクチャのサイズの型にのみ適用されますか? (32bit の場合は 4 バイト、64bit の場合は 8 バイト)。これがvolatileキーワードがプリミティブ型にのみ適用される
理由ですか? (8 バイトのメンバーを volatile として宣言すると、インターロックされた命令を使用してその値を変更することになりますか?[32 ビット マシンでは 4 バイトを超える型の原子性は保証されないため])。
私は十分に明確だったと思います.. :)
ありがとう
c# - メモリバリアの使用
次のコードサンプルでは、最新の値が確実に読み取られるようにするために、 FuncAのメモリバリアが必要ですか?
編集:そうでない場合、FuncAが最新の値を読み取るようにするにはどうすればよいですか?(最近の値が実際にプロセッサのキャッシュに保存されていることを確認したい)[ロックを使用せずに]
c# - メモリフェンスはデータの「鮮度」にどのように影響しますか?
次のコード サンプル ( http://www.albahari.com/threading/part4.aspx#_NonBlockingSynchから取得)について質問があります。
これに続いて、次の説明が続きます。
「バリア 1 と 4 は、この例が「0」を書き込むのを防ぎます。バリア 2 と 3 は、鮮度を保証します。B が A の後に実行された場合、_complete の読み取りが true と評価されることを保証します。」
メモリバリアの使用が命令の並べ替えにどのように影響するかは理解していますが、言及されているこの「鮮度保証」とは何ですか?
この記事の後半では、次の例も使用されます。
この例の後に、次の説明が続きます。
「完全な変数が CPU レジスタにキャッシュされているため、このプログラムは決して終了しません。while ループ内に Thread.MemoryBarrier への呼び出しを挿入する (または読み取り完了をロックする) と、エラーが修正されます。」
もう一度…ここで何が起こりますか?