問題タブ [interlocked]
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# - 64 ビット C# コンパイラ/JITer は、Int64 のインターロック操作でどのような最適化を実行しますか?
私は、32 ビットと 64 ビットのコードベースをサポートする必要があるいくつかのスレッド化されたライブラリ コードに取り組んでいるため、特に Int64 の非アトミック ロードとストアを処理するために、論争の的となるパス全体でさまざまなインターロック呼び出しがあります。
64 ビット プラットフォームで実行する場合、Int64s で動作するときに行われる特別な最適化はありますか? 具体的には、Interlocked.Read(...) 呼び出しは同等の通常の代入に変換されますか? 結果が破棄される Interlocked.Exchange(...) 呼び出しも通常の代入になりますか?
c# - Interlocked.Exchange と Volatile.Write の違いは?
Interlocked.Exchange
とはどう違いVolatile.Write
ますか?
どちらのメソッドも、変数の値を更新します。誰かがそれぞれをいつ使用するかを要約できますか?
特にdouble
、配列のアイテムを更新する必要があり、別のスレッドに最新の値を表示させたいと考えています。何が好ましいですか?Interlocked.Exchange(ref arr[3], myValue)
またはVolatile.Write(ref arr[3], info);
どこarr
で宣言されていdouble
ますか?
実際の例では、次double
のように配列を宣言します。
あるスレッドで、次のように更新します。
別のスレッドで、この配列を次のように読みました。
私にとっては、そのままで問題なく動作します。ただし、「常に機能する」ことを確認するには、またはのいずれかを追加するVolatile.Write
必要がありInterlocked.Exchange
ます。二重更新はアトミックであることが保証されていないためです。
この質問への回答では、Volatile
とInterlocked
クラスの詳細な比較を見たいと思います。なぜ2つのクラスが必要なのですか? どちらをいつ使用するのですか?
運用中のプロジェクトでのロック メカニズムの実装からの別の例:
この API のユーザーがRelease1
またはRelease2
メソッドを呼び出した場合、実質的な違いはありますか?
c++ - これにインターロックはありますか?C++
注意してください - これらのビルドは VS2008/VS2010 ビルド用で、11 のコンストラクトは使用できません。
ある出版社の話を聞いている購読者がいると想像してください。パブリッシャーには、サブスクライバー ポインターのコンテナーがあります。私の void detach(ISubscriber *) では、サブスクライバー リストをロックする代わりに、そのサブスクライバーの適切な単語がないため、ポインターを "NULL" します。
3 行目 - ポインターがテストされ、有効なオブジェクトを指しています。行 4 が実行される前に、別のスレッドがサブスクライバーを NULL にします。ライン 4 - ブーム。
私の質問は、テストと呼び出しがアトミックになるように、ある種のインターロックされたものを使用できる方法はありますか。
たとえば、デストラクタで参照カウントされたオブジェクトの場合、次のようなものが機能します
ここでは、参照カウンターがデクリメントされ、自動的にゼロに対してテストされ、ゼロに等しい場合にのみ、データが解放されます。
ポインターの有効性に基づいて関数を呼び出すためにこれを行う方法はありますか?
編集 1: コメントに基づいて少し明確にする必要があります。返信ありがとうございます。パブリッシャーは、サブスクライバーの "メモリの解放" に対して責任を負わないため、リークは発生しません。通知の後、パブリッシャーは、null アウトされたサブスクライバーを削除してコンテナーをクリーンアップするループを通過します。
次に、加入者自身についてです。彼らが切り離すとき、彼らは出版社の話を聞くことから切り離されているだけです。それら自体は静的オブジェクトで存続します (これは私たちが必要としているコントラクトです)。なんで?通知中にロックを保持する余裕がないためです。他の唯一のオプションは、将来のバージョン管理のために、この DLL に組み込まれないことが決定された Share_Ptr を使用することでした。
私は手書きの shared_ptr を作成しましたが、リソース管理クラスにラップされていないオブジェクトへの参照は同じ落とし穴に陥り、サブスクライバーがそうしないことを確認する必要がある「要件」をプッシュするだけであることに気付きました。上記のサブスクライバーの実装内のダングリング参照を参照してください。
サブスクライバーを「解放」することはできません。現在、これを使用するすべてのクライアントは静的オブジェクトです。私たちはただ未来を見据えていました。一部のユーザーはレガシー アプリであり、enabled_shared_from_this などを取り込むのは容易ではありません。
c - メモリバリアなしでInterlockedIncrementを実装するにはどうすればよいですか?
私は参照カウントスキーマを実装しています。このためには、インターロック機能が必要ですが、メモリフェンスは必要ありません(私が理解している限り)。
残念ながら、WindowsにのみInterlockedDecrementNoFenceコンパイラが組み込まれています。asmインライン化でこれを行うにはどうすればよいですか?gcc/clangにもこれが必要です。
c# - 静的フィールドを使用して連動させる必要がありますか?
スレッドセーフとアトミック操作を静的フィールドで提供する必要がある場合は、静的フィールドを使用して連動させる必要があります。静的フィールドはデフォルトでアトミックですか? 例えば:
ありがとう。
c# - Interlocked.Exchange の説明
答えを見つけることができなかったいくつかの簡単な (できれば) 質問があります -
複数のスレッドにアクセスできるオブジェクト a、b があるとします。
「b」が揮発性でない場合、この操作はそれをそのように扱いますか? つまり、この変数の最新の値をメモリから取得しますか? もしそうなら、それは書き込みで「アトミック」に読み取られますか?Interlocked.Exchange の主な目的は、新しい書き込みによるアトミック操作として以前の値 'a' を取得することであることを理解しています。しかし、私の主な混乱は、「b」の値が実際に「a」に書き込まれることです。
私の 2 番目の質問は、この記事の引用に関連しています。
http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
「興味深い点の 1 つは、C# でのすべての書き込みは、こことここで文書化されているメモリ モデルに従って揮発性であり、おそらくそのように実装されていることです。C# 言語の ECMA 仕様は、実際にはデフォルトで書き込みが揮発性ではない、より弱いモデルを定義しています。 ."
これは本当ですか?もしそうなら、「a」の以前の値を気にしない場合、Interlocked.Exchange の目的はありますか? (私の最初の例に関係する)。すべての書き込みが揮発性であることについて、StackOverflow に関する他の記事やコメントは見当たりません。ただし、書き込みはアトミックであることは理解しています。
編集:私の最初の質問への答えが「b」は揮発性として扱われないということであり、2番目の質問への答えが書き込みが実際に揮発性であるということである場合、フォローアップは、interlocked.exhangeが有用な場合はいつですか? 「a」の以前の値は気にしませんか?
c# - Interlocked.CompareExchange等値の代わりに GreaterThan または LessThan を使用する
このSystem.Threading.Interlocked
オブジェクトでは、アトミック操作として加算 (減算) と比較が可能です。等価性だけでなく、アトミックな比較として GreaterThan/LessThan も行う CompareExchange は非常に価値があるようです。
仮説上Interlocked.GreaterThan
の IL の機能ですか、それとも CPU レベルの機能ですか? 両方?
他のオプションがない場合、C++ またはダイレクト IL コードでそのような機能を作成し、その機能を C# に公開することは可能ですか?
c# - 等しくない場合、Interlocked.CompareExchange?
重複の可能性:
Interlocked.CompareExchange<Int> が等値の代わりに GreaterThan または LessThan を使用している
Interlocked.CompareExchange は、値と被比較対象が等しい場合にのみ値を交換することを知ってい
ます.このようなことを達成するために等しくない場合にそれらを交換するにはどうすればよいですか?
.net - 参照によって値型変数を静的メソッドスレッドセーフに渡しますか?
コードは次のようになります。
次のような他の場所でこのメソッドを呼び出します。
Interlocked.Increment がスレッドセーフの問題を処理すると思いましたよね?
編集:
次のような Job クラスが複数あります。
catch ブロックで Interlocked.Increment を直接呼び出す方がおそらく良い方法だと思います。
ただし、 JobManager.TrackExceptionCount(ref _exceptionCount) がおそらく機能するかどうかを知りたい
ありがとう。
c# - Interlocked.CompareExchange を Bit で使用できますか?
10,000 個の同時タスクの完了を追跡する int の配列があります。値は 1 または 0 です。この配列が Bit の配列であり、各同時スレッドが interlocked.CompareExchange (または同様のもの) を使用すると、より効率的だと思います。 ) 単一のビットを変更します。
Interlocked に「ビット」のオーバーロードがない場合、これにどのようにアプローチすればよいですか?