問題タブ [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.
multithreading - スレッド化と安全でない変数
ここにリストされているコードがあります: Threading and Sockets。
その質問に対する答えは、 で変更することでしisListening
たvolatile
。私が指摘したように、その修飾子により、別のスレッドから変数にアクセスできました。MSDN を読んだ後、次の新しく作成されたスレッド プロセスから isListening を読んでいることに気付きました。
だから、今私の質問:
私
volatile
は基本的に変数に対して非スレッドセーフなリクエストを行っているので、推奨される方法はありますか? Interlocked クラスについて読んだことがありますが、これが自分のコードで使用するのに適しているかどうか疑問に思いました。Interlocked は何をしているかに似ていますlock(myObj)
が、もう少し「才能」とコントロールがあります。lock(myObj)
コードブロックを適用するだけでisListening
はうまくいかないことはわかっています。Interlocked クラスを実装する必要がありますか?
お時間をいただき、ご回答いただきありがとうございます。
java - プリミティブ型の揮発性または同期?
Java では、変数のサイズが 32 ビット以下の場合、割り当てはアトミックですが、32 ビットを超える場合はそうではありません。
二重割り当てまたは長い割り当ての場合、どの (揮発性/同期) を使用するのがより効率的ですか?
お気に入り、
synchronized はプリミティブ引数には適用できません。この場合、同期を使用するにはどうすればよいですか? もちろん、クラスをロックしたくないので、this
使用しないでください。
multithreading - 読み取りメモリバリアと揮発性を理解するにはどうすればよいですか
一部の言語はvolatile
、変数をバックアップするメモリを読み取る前に「メモリバリアの読み取り」を実行すると説明される修飾子を提供します。
読み取りメモリバリアは、一般に、CPUがバリアの後に要求された読み取りを実行する前に、バリアの前に要求された読み取りを実行したことを確認する方法として説明されます。ただし、この定義を使用すると、古い値を読み取ることができるように見えます。つまり、特定の順序で読み取りを実行することは、メインメモリまたは他のCPUを調べて、読み取りバリア時のシステムの最新値を実際に反映したり、その後に書き込みを行ったりする必要があることを意味するわけではありません。読み取りバリア。
それで、volatileは、最新の値が読み取られることを本当に保証しますか、それとも、読み取られる値が少なくともバリア前の読み取りと同じくらい最新であることを保証しますか?または他の解釈?この答えの実際的な意味は何ですか?
c# - C#揮発性配列アイテム?
揮発性アイテムを含む配列が必要ですが、それを行う方法が見つかりません。
これは、_arr 参照が揮発性であることを意味しますが、_arr オブジェクト自体の内部の項目については何も保証しません。
_arr の項目を揮発性としてマークする方法はありますか?
ありがとう。
編集:
Binarycoder の回答に従って構築された次のコード。このコードはスレッドセーフで使用できますか?
java - 揮発性ブール値
揮発性ブール値 (有効と呼びましょう) がある場合、次のコードは Java でスレッドセーフですか?
または、valid が false の場合にのみ true に設定されるため、同期する必要がありますか (したがって、valid のセットは現在の値に依存します)。
java - 並行性、オブジェクトの可視性
以下のコードに潜在的な同時実行性の問題があるかどうかを調べようとしています。具体的には、揮発性変数に関連する可視性の問題。揮発性は次のように定義されます。この変数の値はスレッドローカルでキャッシュされることはありません。すべての読み取りと書き込みは「メインメモリ」に直接送信されます。
上記のシングルスレッドエグゼキュータの場合:
test.stateを不揮発性にしても大丈夫ですか?言い換えると、連続するすべてのTest.run()(これも、エグゼキュータがシングルスレッドであるため、同時にではなく順次発生します)は、常に更新されたtest.state値を参照しますか?そうでない場合、Test.run()を終了すると、スレッドで行われた変更がローカルでメインメモリに書き戻されることが保証されませんか?それ以外の場合、スレッドの終了時にそうでない場合、ローカルで行われた変更がメインメモリに書き戻されるのはいつですか?
c# - オブジェクトがロックなしで他のスレッドによって使用されていないことを確認しますか?
ロックステートメントを使用せず、パフォーマンス上の理由から volatile と Interlocked のみを使用して、高性能のスレッドセーフコンポーネントを実装しています。
クラスに、スレッドセーフなインスタンスを含む揮発性の参照型メンバーがあります。このインスタンスは、いくつかの操作に対してのみスレッド セーフであり、別の操作ではスレッド セーフではありません。そのため、およびパフォーマンス上の理由から、元のインスタンスを更新する代わりに新しいインスタンスを作成することを好む場合があり、特にロックステートメントを使用しないため、実際に高速に動作します。
そのため、volatile メンバーはいつでも別のインスタンスに置き換えることができます。volatile キーワードを使用すると、マルチスレッド環境で問題が発生しなくなります。
もちろん、これは非常にうまく機能しますが、唯一の問題は、古いインスタンスのガベージ コレクションです。コンポーネントのパフォーマンスをテストしたところ、リリースされたインスタンスのガベージ コレクションに時間がかかりすぎていることがわかりました。
今、古いインスタンスをリサイクルする方法を探しています。問題は、このインスタンスをまだ使用している別のスレッドが存在する可能性があり、このインスタンスを誰も使用していないことを保証する方法 (ロックなし) が見つからないため、交換時に古いインスタンスを取得してその状態をリセットすることができないことです。もう。
ロックステートメントなしで古いインスタンスを使用するスレッドがないことをどのように保証できますか? (volatile と Interlocked が推奨されます)
ありがとう。
c# - .NET の二重チェック ロックでの volatile 修飾子の必要性
複数のテキストでは、.NET でダブルチェック ロックを実装する場合、ロックしているフィールドに volatile 修飾子を適用する必要があると書かれています。しかし、なぜ正確に?次の例を検討してください。
「ロック (syncRoot)」が必要なメモリの一貫性を達成しないのはなぜですか? 「ロック」ステートメントの後、読み取りと書き込みの両方が揮発性になり、必要な一貫性が達成されるというのは本当ではありませんか?
c - 揮発性構造体のセマンティクス
構造体型変数のインスタンスを揮発性として宣言するだけで十分ですか(そのフィールドが再入可能コードでアクセスされる場合)、または構造の特定のフィールドを揮発性として宣言する必要がありますか?
別の言い方をすれば、以下の間の意味上の違い(もしあれば)は何ですか?
と
ポインタ型変数をvolatileとして宣言すると(たとえば、volatile uint8_t * foo)、fooが指すアドレスが変更される可能性があることをコンパイラに通知するだけであり、fooが指す値については何も記述しません。構造型変数に類推が当てはまるかどうかは私にはわかりません。
.net - .NET メモリ モデル、揮発性変数、およびテスト アンド セット: 何が保証されていますか?
.NET メモリ モデル (.NET Framework 上。compact/micro/silverlight/mono/xna/what-have-you ではない) では、特定の型 (特にプリミティブ整数と参照) の操作が保証されていることを知っています。アトミック。
さらに、x86/x64 の test-and-set 命令 (およびInterlocked.CompareExchange
) は実際にはグローバル メモリの場所を参照しているため、成功すると別の命令Interlocked.CompareExchange
が新しい値を参照することになると思います。
最後に、volatile
キーワードは、読み取りと書き込みをできるだけ早く伝達し、この変数に関する操作の順序を変更しないようにするためのコンパイラへの指示であると思います (右?)。
これにより、いくつかの疑問が生じます。
- 上記の私の信念は正しいですか?
Interlocked.Read
int のオーバーロードはなく、long (2 つの WORD であるため、通常はアトミックに読み取られません) のみです。.NET メモリ モデルでは、整数/参照を読み取るときに最新の値が表示されることが保証されていると常に想定していましたが、プロセッサ キャッシュやレジスタなどを使用すると、これが不可能になる可能性があることがわかり始めています。変数を強制的に再フェッチする方法はありますか?- volatile は、整数と参照に関する上記の問題を解決するのに十分ですか?
- x86/x64では、それを想定できます...
2 つのグローバル整数変数 x と y があり、どちらも 0 に初期化されている場合、次のように記述します。
その NO スレッドは、x = 0 および y = 2 を認識します (つまり、書き込みは順番に発生します)。それらが揮発性である場合、これは変わりますか?