問題タブ [volatile]
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# - スレッドセーフなロックコードで「volatile」または「Thread.MemoryBarrier()」を使用する場合 (C#)
スレッドセーフのためにvolatile/Thread.MemoryBarrier()を使用する必要があるのはいつですか?
java - 他のフィールドに関する揮発性セマンティック
次のコードがあるとします
揮発性としてマークされた変更されたフィールドとその値は、以前の状態に依存しません。Service
したがって、これは正しいマルチスレッド コードです (実装についてはしばらく気にしないでください)。
私の知る限り、揮発性変数を読み取ることは、メモリの可視性の観点から、ロックに入るようなものです。これは、通常の変数の読み取りが揮発変数の読み取りで順序を変更できないためです。
これは、次のコードが正しいことを意味しますか?
c - 関数呼び出しで volatile static uint8_t から uint8_t へのキャストを避けますか?
私は現在、このコードを持っています:
関数呼び出しでキャストを回避する方法はありますか?
java - ReentrantLock 経由でアクセスされるフィールドには volatile キーワードが必要ですか?
私の質問は、ReentrantLock の使用が、synchronized キーワードが提供するのと同じ点でフィールドの可視性を保証するかどうかについてです。
たとえば、次のクラスAでは、synchronized キーワードが使用されているため、フィールドsharedDataを volatile と宣言する必要はありません。
ただし、ReentrantLock を使用する次の例では、フィールドに volatile キーワードが必要ですか?
いずれにせよ volatile キーワードを使用してもパフォーマンスへの影響はごくわずかであることはわかっていますが、それでも正しくコーディングしたいと考えています。
c# - Interlocked.CompareExchange はメモリ バリアを使用しますか?
Volatile の読み取りと書き込み、および適時性に関する Joe Duffy の投稿を読んでいて、投稿の最後のコード サンプルについて何かを理解しようとしています。
2 番目の CMPXCHG 操作が実行されるとき、メモリ バリアを使用して、m_stateの値が実際に書き込まれた最新の値であることを確認しますか? それとも、プロセッサのキャッシュに既に格納されている値を使用するだけですか? ( m_stateが volatile として宣言されていないと仮定します)。
私の理解が正しければ、CMPXCHG がメモリ バリアを使用しない場合、最初にロックを取得したスレッドがすべてを取得する可能性が高いため、ロック取得手順全体は公平ではありません。次のロックの。私は正しく理解しましたか、それともここで何かを見逃していますか?
編集: 主な問題は、実際に CompareExchange を呼び出すと、m_state の値を読み取ろうとする前にメモリ バリアが発生するかどうかです。そのため、CompareExchange を再度呼び出そうとしたときに、すべてのスレッドに 0 の割り当てが表示されるかどうか。
c++ - ミューテックスの存在は揮発性キーワードを取り除くのに役立ちますか?
読み取り、書き込み、保留中の読み取り、保留中の書き込みカウンターを保持するマルチ R/W ロック クラスがあります。ミューテックスは、それらを複数のスレッドから保護します。
私の質問は、コンパイラーが最適化の実行中にカウンターを台無しにしないように、カウンターを揮発性として宣言する必要がありますか?
または、コンパイラは、カウンターがミューテックスによって保護されていることを考慮していますか。
ミューテックスは同期のための実行時のメカニズムであり、「volatile」キーワードは、最適化を行いながら正しいことを行うためのコンパイラへのコンパイル時の指示であることを理解しています。
よろしく、 -ジェイ。
java - 複数のスレッドがフィールドにアクセスできる場合、それを揮発性としてマークする必要がありますか?
いくつかのスレッド(一般的な同時実行の問題、揮発性キーワード、メモリモデル)を読んでいます。Javaの同時実行の問題について混乱しています。
複数のスレッドからアクセスされるフィールドがたくさんあります。それらを調べて、すべて揮発性としてマークする必要がありますか?
クラスを構築するとき、複数のスレッドがそれにアクセスするかどうかわからないので、フィールドを揮発性にしないことは確かに安全ではありません。したがって、私の理解では、クラスを使用しないケースはほとんどありません。これは正しいです?
私にとって、これはバージョン1.5 JVM以降に固有ですが、私の特定のセットアップについての回答に限定されているとは感じません。
c - 揮発性変数
揮発性変数はプログラム メモリのどこに格納されますか (どのセクションに) ?
c# - Interlockedクラスを使用するのとは対照的に、volatileキーワードを使用する利点はありますか?
言い換えれば、正規変数とInterlockedクラスでは解決できない揮発性変数を使用して何かを行うことはできますか?
c# - メモリバリアと大きな構造体?
100 バイトで構成される構造体があるとします。次のコードについてどのような保証がありますか?
メモリ モデルは、メモリ バリアの配置後に 100 バイトのコピーが完了することを保証しますか? またはメモリバリアは、プロセッサのアーキテクチャのサイズの型にのみ適用されますか? (32bit の場合は 4 バイト、64bit の場合は 8 バイト)。これがvolatileキーワードがプリミティブ型にのみ適用される
理由ですか? (8 バイトのメンバーを volatile として宣言すると、インターロックされた命令を使用してその値を変更することになりますか?[32 ビット マシンでは 4 バイトを超える型の原子性は保証されないため])。
私は十分に明確だったと思います.. :)
ありがとう