タグ付けされた質問 「volatile」

Volatileは、「独自に変更できる」データストレージ領域(オブジェクト、フィールド、変数、パラメーター)を定義するために使用される修飾子であり、一部のコードジェネレーターの最適化を許可しません。この修飾子を認識するすべての言語ではありませんが、そのようなデータへのアクセスはスレッドセーフです。

22
volatileキーワードは何に役立ちますか
今日の仕事で、私volatileはJavaでキーワードに出くわしました。あまり詳しくないので、次の説明を見つけました。 Javaの理論と実践:ボラティリティの管理 その記事で問題のキーワードを説明している詳細を考えて、それを使用したり、このキーワードを正しい方法で使用できるケースを見たりしたことがありますか?

9
揮発性vs.インターロックvs.ロック
クラスに、public int counter複数のスレッドによってアクセスされるフィールドがあるとしましょう。これintは、増分または減分されるだけです。 このフィールドをインクリメントするには、どのアプローチを使用する必要がありますか。その理由は何ですか。 lock(this.locker) this.counter++;、 Interlocked.Increment(ref this.counter);、 のアクセス修飾子をcounterに変更しますpublic volatile。 私が発見したvolatileので、私は多くのlockステートメントとの使用を削除してきましたInterlocked。しかし、これを行わない理由はありますか?


7
アトミック/揮発性/同期の違いは何ですか?
アトミック/揮発性/同期化は内部的にどのように機能しますか 次のコードブロックの違いは何ですか? コード1 private int counter; public int getNextUniqueIndex() { return counter++; } コード2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } コード3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } volatile次のように機能しますか?です volatile int i = 0; void incIBy5() { i += 5; } に相当 …

8
Javaにおける揮発性vs静的
これはstatic、すべてのオブジェクトvolatileの値の1つのコピーを意味し、すべてのスレッドの値の1つのコピーを意味するというのは正しいでしょうか。 とにかく、static変数の値もすべてのスレッドで1つの値になるので、どうしてそうする必要があるのvolatileでしょうか。


4
Javaでの揮発性と同期の違い
変数をJava として宣言することとvolatile、常にsynchronized(this)ブロック内の変数にアクセスすることの違いに疑問を感じていますか? この記事http://www.javamex.com/tutorials/synchronization_volatile.shtmlによると、言うべきことがたくさんあり、多くの違いがありますが、いくつかの類似点もあります。 私はこの情報に特に興味があります: ... 揮発性変数へのアクセスがブロックする可能性は決してありません。単純な読み取りまたは書き込みを行うだけなので、同期ブロックとは異なり、ロックを保持することはありません。 volatile変数にアクセスしてもロックは保持されないため、アトミック操作として読み取り、更新、書き込みを行う場合には適していません(「更新を見逃す」準備ができていない限り)。 read-update-writeとはどういう意味ですか?書き込みも更新ではないのですか、それとも単に更新が読み取りに依存する書き込みであることを意味していますか? 何volatileよりも、synchronizedブロックを介して変数にアクセスするよりも、変数を宣言する方が適しているのはいつですか。volatile入力に依存する変数に使用するのは良い考えですか?たとえばrender、レンダリングループを通じて読み取られ、keypressイベントによって設定されるという変数がありますか?


9
マルチスレッドのCまたはC ++プログラミングでvolatileが役に立たないと見なされるのはなぜですか?
私が最近投稿したこの回答で示されているように、私はvolatileマルチスレッドプログラミングコンテキストでのユーティリティ(またはその欠如)について混乱しているようです。 私の理解はこれです。変数にアクセスするコードの制御の流れの外で変数が変更される可能性がある場合は常に、その変数をとして宣言する必要がありますvolatile。シグナルハンドラー、I / Oレジスター、および別のスレッドによって変更された変数はすべて、このような状況を構成します。 したがって、グローバルintがありfoo、foo1つのスレッドによって読み取られ、別のスレッドによって(おそらく適切なマシン命令を使用して)アトミックに設定されている場合、読み取りスレッドは、シグナルハンドラーによって微調整された変数を見るのと同じようにこの状況を認識します。外部ハードウェア条件によって変更されるため、foo宣言する必要がありますvolatile(または、マルチスレッドの状況では、メモリフェンスの負荷でアクセスします。これはおそらくより良い解決策です)。 どのように、どこで私は間違っていますか?

8
「揮発性」キーワードは何に使用されますか?
OverаэтотвопросестьответынаStack Overflowнарусском:КлючевоесловоvolatileвJava volatileキーワードに関する記事をいくつか読んだのですが、正しい使い方がわかりませんでした。C#とJavaで何を使用する必要があるか教えていただけますか?
130 c#  java  volatile 

5
マルチスレッドでvolatileを使用するのはいつですか?
グローバル変数にアクセスするスレッドが2つある場合、多くのチュートリアルでは、変数を揮発性にして、コンパイラーが変数をレジスターにキャッシュしないようにし、正しく更新されないようにします。ただし、共有変数にアクセスする2つのスレッドは、ミューテックスを介して保護を要求するものではありませんか。しかし、その場合、スレッドのロックとミューテックスの解放の間に、コードはその1つのスレッドだけが変数にアクセスできるクリティカルセクションにあります。この場合、変数は揮発性である必要はありませんか? したがって、マルチスレッドプログラムでのvolatileの使用/目的は何ですか?

4
揮発性は高価ですか?
揮発性の実装、特にセクション「アトミック命令との相互作用」について、コンパイラライター向けのJSR-133クックブックを読んだ後、更新せずに揮発性変数を読み取るには、LoadLoadまたはLoadStoreバリアが必要だと思います。ページのさらに下を見ると、LoadLoadとLoadStoreは、X86 CPUでは実質的に何もしません。これは、x86で明示的なキャッシュ無効化なしで揮発性読み取り操作を実行でき、通常の変数読み取りと同じくらい高速であることを意味しますか(揮発性の並べ替えの制約を無視)。 私はこれを正しく理解していないと思います。誰かが私を啓蒙したいと思いませんか? 編集:マルチプロセッサ環境に違いがあるのでしょうか。ジョンVが述べているように、シングルCPUシステムでは、CPUはそれ自体のスレッドキャッシュを調べる可能性がありますが、マルチCPUシステムでは、CPUにいくつかの構成オプションが必要です。マルチCPUシステムで、そうですか? PS:これについて詳しく知る途中で、次のすばらしい記事に出くわしました。この質問は他の人にとって興味深いかもしれないので、ここでリンクを共有します。 Javaの理論と実践:Javaメモリモデルの修正、パート1と Javaの理論と実践:Javaメモリー・モデルの修正、パート2

6
C#でのvolatileキーワードの使用例
volatileキーワードの動作を視覚的に示す小さなプログラムをコーディングしたいと思います。理想的には、非揮発性の静的フィールドへの同時アクセスを実行し、そのために正しくない動作をするプログラムである必要があります。 同じプログラムにvolatileキーワードを追加すると、問題が修正されます。 私がなんとか成し遂げられなかったもの。何度か試したり、最適化を有効にしたりしても、「volatile」キーワードなしで常に正しい動作が得られます。 このトピックについて何か知っていますか?簡単なデモアプリでそのような問題をシミュレートする方法を知っていますか?ハードウェアに依存しますか?
88 c#  .net  volatile 

6
C ++での揮発性と可変性
揮発性と可変性の違いについて質問があります。私は、2つの両方がそれが変更される可能性があることを意味することに気づきました。ほかに何か?それらは同じものですか?違いは何ですか?それらはどこに適用できますか?なぜ2つのアイデアが提案されているのですか?それらを別の方法で使用する方法は? どうもありがとう。
85 c++  volatile  mutable 

13
C ++のvolatileキーワードはメモリフェンスを導入しますか?
volatile値が変更される可能性があることをコンパイラに通知することを理解していますが、この機能を実現するために、コンパイラはそれを機能させるためにメモリフェンスを導入する必要がありますか? 私の理解では、揮発性オブジェクトに対する一連の操作は並べ替えることができず、保持する必要があります。これは、いくつかのメモリフェンスが必要であり、これを回避する方法が実際にはないことを意味しているようです。私はこれを言うのは正しいですか? この関連する質問で興味深い議論があります ジョナサンウェイクリーは書いています: ...個別の揮発性変数へのアクセスは、それらが別々の完全な式で発生する限り、コンパイラーによって並べ替えることはできません...揮発性はスレッドセーフには役に立たないが、彼が与える理由ではありません。これは、コンパイラが揮発性オブジェクトへのアクセスを並べ替える可能性があるためではなく、CPUがそれらを並べ替える可能性があるためです。アトミック操作とメモリバリアにより、コンパイラとCPUの並べ替えが妨げられます これにデビッド・シュワルツ氏は返信コメントで: ... C ++標準の観点からは、コンパイラが何かを実行することと、コンパイラがハードウェアに何かを実行させる命令を発行することとの間に違いはありません。CPUが揮発性物質へのアクセスを並べ替える可能性がある場合、標準ではそれらの順序を保持する必要はありません。..。 ... C ++標準では、並べ替えの内容を区別していません。そして、CPUが観察可能な影響なしにそれらを並べ替えることができると主張することはできないので、それは問題ありません-C ++標準はそれらの順序を観察可能として定義しています。コンパイラーは、プラットフォームに標準が要求することを実行させるコードを生成する場合、プラットフォーム上のC ++標準に準拠しています。標準が揮発性物質へのアクセスを並べ替えないことを要求している場合、プラットフォームは揮発性物質を並べ替えることに準拠していません。..。 私のポイントは、C ++標準がコンパイラーによる個別の揮発性物質へのアクセスの並べ替えを禁止している場合、そのようなアクセスの順序はプログラムの観察可能な動作の一部であるという理論に基づいて、CPUが実行することを禁止するコードを発行することもコンパイラーに要求するということです。そう。この規格は、コンパイラーが行うことと、コンパイラーの生成コードがCPUに行うことを区別していません。 どちらが2つの質問をもたらします:どちらかが「正しい」ですか?実際の実装は実際に何をしますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.