問題タブ [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.
.net - Interlocked.Read / Interlocked.Exchange は、.NET よりも Mono の方がはるかに遅いですか?
長い質問で申し訳ありませんが、Jon Skeet のリファレンスがあるので、一部の人にとっては価値があるかもしれません。
要するに:
Interlocked.Read
/Interlocked.Exchange
は、.NET フレームワークで実行している場合よりも、Mono フレームワークで実行している場合の方がパフォーマンスがはるかに遅いようです。その理由を知りたいです。
要するに:
32 ビット プラットフォーム用のスレッド セーフな double が必要だったので、次の構造体を作成しました。
次に、Jon Skeet's answer to this questionを読んだので、次の構造体を作成しました。
次に、このテストを書きました:
そして、.NET フレームワークを使用して次の結果を得ました。
そして、Mono フレームワークを使用したこの結果:
同じマシン (Windows XP) で両方のテストを複数回実行しましたが、結果は一貫しています。Mono フレームワークで Interlocked.Read/Interlocked.Exchange のパフォーマンスが非常に遅いように見える理由を知りたいです。
アップデート:
次の簡単なテストを書きました。
.NET フレームワークは、 と の両方で一貫して~2.5秒を返します。Mono フレームワークは~5.1秒を返します。Exchange
Read
c# - 方法:一度だけ呼び出すことができるスレッドセーフなメソッドを作成しますか?
(オブジェクトインスタンスごとに)一度だけ呼び出すことができるスレッドセーフなメソッドを書き込もうとしています。以前に呼び出されたことがある場合は、例外をスローする必要があります。
私は2つの解決策を考え出しました。どちらも正しいですか?そうでない場合、それらの何が問題になっていますか?
と
/li>lock
:-
私が間違っていなければ、このソリューションにはロックフリーであるという利点があり(私の場合は無関係のようです)、必要なプライベートフィールドが少なくて済みます。
また、どの解決策を優先すべきかについての正当な意見や、より良い方法がある場合はさらに提案することもできます。
winapi - InterlockedCompareExchange Release()とAcquire()の違いは何ですか?
InterlockedCompareExchangeRelease()
との違いは何InterlockedCompareExchangeAcquire()
ですか?
WIN32 APIを使用して同期関数を学習しようとすると、名前が異なる2つの関数がありますが、同じことをしているようです。
と
私はMSDNをチェックします、それはそれらの関数が次のとおりであると言います:
指定された値に対してアトミックな比較交換操作を実行します。この関数は、指定された2つの32ビット値を比較し、比較の結果に基づいて別の32ビット値と交換します。
しかし、のためInterlockedCompareExchangeAcquire()
に、
この操作は、メモリアクセスの取得セマンティクスを使用して実行されます。
とのためInterlockedCompareExchangeRelease()
に、
交換は、リリースメモリアクセスセマンティクスを使用して実行されます。
ですから、これら2つの機能の違いに興味があります。いつメモリアクセスセマンティクスを取得するか、メモリアクセスセマンティクスを解放するか。例はありますか?
ありがとう!
c# - 競合が最も少ないラウンドロビンスレッドシナリオの数値をどのようにインクリメントする必要がありますか?
多くのスレッドがGetNextNumber
次のコードと同時に呼び出している場合、GetNextNumber
は他のどの番号よりも1回多く返されます。
ロックを使用せずに、_lastNumber
元に戻して、スレッド呼び出しごとに増分された数を確実に返す方法はありますか?GetNextNumber()
visual-c++ - 頻繁なリバース エンジニアリング
いくつかのコードをリバース エンジニアリングして、共通のパターンに何度も遭遇しようとしていますが、それが何であるかはわかりません。コードは VC++ 2010 でコンパイルされており、表示用にいくつかの外部 CLR コンポーネントを使用しています (ただし、私が知る限り、内部用ではありません)。
オブジェクトを返すいくつかの関数に見られるパターンのいくつかは、次のいずれかです。
InterlockedIncrement
返品するobj_ptr - 12
前に行うInterlockedDecrement
onの結果を確認しobj_ptr - 12
、結果が 0 の場合は呼び出します*(*(obj_ptr - 24) + 64)(obj_ptr - 24)
デストラクタへの熱心な呼び出しによる参照カウントに基づくGCのように見えます。これが正しいかどうか、誰かが確認できますか、それとも他のシステムですか?
もしそうなら - 私が見ることができる既知のインターフェースはありますか? 値を返す前に Increment を実行する場所が、そのタイプの「新しい」の拡張バージョンであると想定できるかどうかを知りたいです。
また、これに関する詳細情報はどこで入手できますか? これは、標準オブジェクトの vtable の一部にすることはできないようです。これは、先頭の短いポインターであると予想されます。RTTI かもしれませんが、そのレイアウトの良い例が見つかりませんでした。ここで、基本クラスをさらに移動する多重継承は期待していません。
c# - この C# ユーティリティ クラスを使用して、Interlocked 経由でスレッドを制御する必要がある場合と使用しない場合
このクラスがどのように作成されたか、またいつ使用すべきか、使用すべきでないかについてのロジックを理解しようとしています。どんな洞察もいただければ幸いです
更新: ソース コードで使用例を見つけました...これは、上記のオブジェクトの使用方法を示していますが、「理由」はわかりません。
c# - スレッドプールはタイマーのコールバック関数をキューに入れ、同時に複数のスレッドをスケジュールすることがありますか?
次のコードTimerRecalcStatisticsElapsed
では、実行中のインスタンスを 1 つだけ持つ必要があります。このコールバックが呼び出すワーカー メソッドは、一度に最大 1 つのスレッドが実行されるように、順番に実行されます。
質問パート 1:
タイマーのコールバックがスレッドプール スレッドを実行する場合 (別のスレッドでコールバックを実行するのではなく)、スレッドプールがキューに入れられ、条件に基づいて後で実行するためにスレッドを延期する可能性があると言うのは正しいですか (MaxThreads に達した、スレッドプールの内部ロジック) ?
質問パート 2:
1 つのタイマー コールバックが即時実行以外のキューに入れられる可能性があると仮定すると、それは任意の数のスレッド コールバックが同時に実行される可能性があることを意味しますか?
質問パート3
パート 2 が正しいと仮定すると、以下のコードで複数のコールバックが同時に動作する可能性があるということですか?
私が質問している理由は、マルチ CPU サーバーで実行されているこのクラスのインスタンスが数千あるためです。の順不同の操作と一致するデータ破損も見られます// Do Work Here
。
さておき
// Do work here
System.Collections.Dictionary と内部的に連携し、y の値を編集します。また、シリアルに呼び出される後続の関数のいくつかのキーも削除されます。その関数には、最初の呼び出しで以前に存在していたキー (x) がありません。これは、最終ステートメントで競合状態があるためだと思いますobj.cleanupdata()
.net - .netSystem.MemberwiseCloneおよびインターロックされた書き込み
値型の配列のMemberwiseCloneを実行する場合:
これらのdoubleが他のスレッドでインターロックされた書き込みを使用して変更されている場合、MemberwiseClonedコピーは、その中でdoubleが破損するリスクがありますか?私はわずかに古い値を持っていることを心配していません、ただ引き裂き、インターロックされたメンバーワイズクローン間の相互作用(これはメモリブリットタイプの操作に変換されると思いますか?)
c# - Interlocked.CompareExchangeの使用
彼ら、
以下の次のコードを評価していただきたいと思います。ご覧のとおり、私はInterlocked.CompareExchangeを使用していますが、このコンテキストでは意味がありますか?(それが正しいかどうかはわかりません)。
メモやコメントなどはよろしくお願いします。
よろしくお願いします。
c# - ThreadPoolスレッドがいつ完了したかを確認する正しい方法は?
スレッドプール内のすべてのスレッドがいつタスクを終了したかを確認する方法を探しています。counter == 0
現在、スレッドがジョブを終了したとき、およびメソッドを呼び出しているときに減少するカウンターを使用していますWorkComplete
。これは機能しているように見えますが、最終的な「ジョブ」に到達すると、結果を処理していないように見えますか? または、少なくとも UI はそれを取得しません。これが私が現在持っているものです:
ワークアイテムのキューイング + インクリメント カウンター
仕事する:
しかし、処理される URL の量は常に合計数よりも 1 少なくなります。これは、最後のスレッドが 'Reporting back' などではないようなものです。誰にもアイデアはありますか?
ありがとうございました