問題タブ [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」修飾子とコンパイラの並べ替え
volatile
コンパイラは、修飾された変数への読み取り/書き込みを削除したり、並べ替えたりすることはできません。
しかし、修飾されているかどうかに関係なく、他の変数が存在する場合はvolatile
どうでしょうか?
シナリオ 1
コンパイラは、1 番目と 2 番目、または 3 番目と 4 番目の代入を並べ替えることができますか?
シナリオ 2
同じ質問ですが、コンパイラは最初と 2 番目、または 3 番目と 4 番目の代入を並べ替えることができますか?
c++ - スレッド同期101
以前、私はいくつかの非常に単純なマルチスレッドコードを作成しましたが、実行中の途中でコンテキストスイッチが発生する可能性があることを常に認識していたため、共有変数へのアクセスを常に保護してきました。 CCriticalSectionクラスは、構築のクリティカルセクションに入り、破棄されます。私はこれがかなり攻撃的であることを知っており、クリティカルセクションに頻繁に、時にはひどく出入りします(たとえば、CCriticalSectionをよりタイトなコードブロック内に置くことができる関数の開始時)が、コードはクラッシュせず、十分に高速に実行されます。
仕事で私のマルチスレッドコードはよりタイトである必要があり、必要な最低レベルでのロック/同期のみです。
仕事で私はいくつかのマルチスレッドコードをデバッグしようとしていました、そして私はこれに出くわしました:
さて、m_bSomeVariable
Win32 BOOL(揮発性ではない)です。これは、私が知る限り、intとして定義されており、x86では、これらの値の読み取りと書き込みは単一の命令であり、コンテキストスイッチは命令境界で発生するため、必要はありません。この操作をクリティカルセクションと同期させるため。
この操作に同期が必要かどうかを確認するためにオンラインでさらに調査を行い、次の2つのシナリオを考え出しました。
- CPUがアウトオブオーダー実行を実装しているか、2番目のスレッドが別のコアで実行されており、更新された値が他のコアが確認できるようにRAMに書き込まれていません。と
- intは4バイトに揃えられていません。
ナンバー1は「volatile」キーワードで解決できると思います。VS2005以降では、C ++コンパイラはメモリバリアを使用してこの変数へのアクセスを囲み、使用する前に変数が常にメインシステムメモリに完全に書き込まれる/読み取られるようにします。
番号2確認できません。バイトアラインメントがなぜ違いを生むのかわかりません。x86命令セットはわかりませんがmov
、4バイトにアラインされたアドレスを指定する必要がありますか?そうでない場合は、指示を組み合わせて使用する必要がありますか?それは問題を引き起こすでしょう。
それで...
質問1:「volatile」キーワード(メモリバリアを使用し、このコードを最適化しないようにコンパイラにヒントを与えることを暗示する)を使用すると、プログラマはx86/x64変数の4バイト/8バイトを読み取り/間で同期する必要がなくなります。書き込み操作?
質問2:変数が4バイト/ 8バイトに整列されているという明示的な要件はありますか?
コードとクラスで定義された変数をさらに掘り下げました。
さて、私にはこれは過度に思えます。クリティカルセクションはプロセス間でスレッドを同期すると思ったので、ある場合はそのセクションに入ることができ、そのプロセス内の他のスレッドは実行できません。保護したい変数ごとにクリティカルセクションは必要ありません。クリティカルセクションにいる場合は、他に何も邪魔することはできません。
クリティカルセクションの外部から変数を変更できる唯一のことは、プロセスが別のプロセスとメモリページを共有し(それを実行できますか?)、他のプロセスが値を変更し始める場合だと思います。ミューテックスもここで役立ちます。名前付きミューテックスはプロセス間で共有されますか、それとも同じ名前のプロセスのみですか?
質問3:クリティカルセクションの分析は正しいですか?このコードはミューテックスを使用するように書き直す必要がありますか?他の同期オブジェクト(セマフォとスピンロック)を見てきましたが、ここの方が適していますか?
質問4:クリティカルセクション/ミューテックス/セマフォ/スピンロックはどこに最適ですか?つまり、どの同期問題に適用する必要があるかです。どちらかを選択すると、パフォーマンスが大幅に低下しますか?
そして、私たちがそれに取り組んでいる間、私は、スピンロックはシングルコアマルチスレッド環境では使用されるべきではなく、マルチコアマルチスレッド環境でのみ使用されるべきであることを読みました。それで、質問5:これは間違っていますか、そうでない場合は、なぜ正しいのですか?
返信ありがとうございます:)
java - 異なる! 間の合計注文数! 揮発変数?
次の Java コードを検討してください。
揮発性アクセスのグローバルに表示される合計注文があった場合、少なくとも 1 つの println に常に到達します。
それは実際にJava標準によって保証されていますか? または、このような実行は可能ですか:
標準で同じvolatile 変数へのアクセスに関するステートメントしか見つかりませんでした (ただし、何かが欠けている可能性があります)。
「揮発性変数への書き込み(§8.3.1.4)vは、任意のスレッドによるvの後続のすべての読み取りと同期します(後続は同期順序に従って定義されます)。」
http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4.4
ありがとう!
c - armcc は -O0 を使用して不揮発性変数を最適化しますか?
armcc コンパイラと -O0 最適化を使用しているときに*Register
asを宣言する必要がありますか?volatile
つまり、-O0 最適化では、そのような変数を として修飾する必要がありますvolatile
か? (これはおそらく -O2 最適化で必要です)
java - volatile キーワードの使用
私が理解しているように、変数を揮発性として宣言すると、ローカルキャッシュに保存されません。スレッドが値を更新するたびに、メイン メモリに更新されます。したがって、他のスレッドは更新された値にアクセスできます。
しかし、次のプログラムでは、揮発性変数と非揮発性変数の両方が同じ値を表示しています。
2 番目のスレッドの volatile 変数は更新されません。testValue が変更されない理由を誰でも説明できますか。
c# - .NET マルチスレッド、揮発性およびメモリ モデル
次のコードがあるとします。
せいだ!主な質問は、なぜ... CPU が flag1 = true; で操作を並べ替えると思います。および if(flag2) ステートメントですが、変数 flag1 および flag2 は揮発性フィールドとしてマークされています...
java - Java : VolatileImage は BufferedImage より遅い
私はJavaでゲームを作成しており、BufferedImagesを使用してコンテンツを画面にレンダリングしています。ゲームを実行するローエンド マシンでパフォーマンスの問題が発生したため、通常は高速な VolatileImage に切り替えました。それらが実際に全体を遅くすることを除いて。
画像は GraphicsConfiguration.createCompatibleVolatileImage(...) で作成され、Graphics.drawImage(... )で画面に描画されます(リンクをたどって具体的に確認してください)。これらは、ダブル バッファリングを使用して Canvas に描画されます。
誰かがここで何がうまくいかないのか考えていますか?
c++ - ユーザーモードスレッドで揮発性変数をスピンしても安全ですか?
軽量の spin_lock を実装するために、ユーザー モード スレッドで揮発性変数をスピンすることが安全かどうかはよくわかりません。tbb ソース コード tbb_machine.h:170 を調べました。
そして、私が見ることができるように、atomic_backoff クラスにはフェンスがありません。他のユーザーモードの spin_lock 実装からのものですが、それらのほとんどは CAS (Compare and Swap) を使用します。
java - volatileは実際にどのように機能しますか?
変数をvolatile
Javaのようにマークすると、すべてのスレッドに、古い値ではなく、最後に書き込まれた値が表示されます。これが実際にどのように達成されるのか疑問に思いました。JVMは、CPUキャッシュなどをフラッシュする特別な命令を発行しますか?
c++ - C++ での「疑似アトミック」操作
したがって、C++ ではアトミックなものは何もないことを認識しています。しかし、私ができる「疑似原子」の仮定があるかどうかを理解しようとしています。その理由は、非常に弱い保証しか必要としない単純な状況でミューテックスを使用することを避けたいからです。
1) 最初に true に設定した volatile bool b をグローバルに定義したとします。次に、ループを実行するスレッドを起動します
その間、別のスレッドで b=true を実行します。
最初のスレッドが引き続き実行されると仮定できますか? つまり、b が true として開始され、2 番目のスレッドが b=true を割り当てると同時に最初のスレッドが b の値をチェックした場合、最初のスレッドが b の値を true として読み取ると仮定できますか? または、代入 b=true の中間点で、b の値が false として読み取られる可能性はありますか?
2) ここで、b が最初は false であるとします。次に、最初のスレッドが実行されます
一方、2 番目のスレッドは b=true を実行します。bad() が呼び出されないと仮定できますか?
3) int やその他の組み込み型について: volatile int i があるとします。最初は (たとえば) 7 で、次に i=7 を割り当てます。この操作中はいつでも、どのスレッドからでも、i の値が 7 に等しいと仮定できますか?
4) volatile int i=7 を使用してから、あるスレッドから i++ を実行すると、他のすべてのスレッドは i の値のみを読み取ります。7 または 8 を除いて、どのスレッドでも値がないと仮定できますか?
5) volatile int i があり、あるスレッドから i=7 を実行し、別のスレッドから i=8 を実行します。その後、i は 7 または 8 (または、割り当てるために選択した 2 つの値) であることが保証されますか?