問題タブ [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.

0 投票する
1 に答える
1037 参照

.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 フレームワークを使用して次の結果を得ました。 .NET連動テスト結果

そして、Mono フレームワークを使用したこの結果: モノ連動試験結果

同じマシン (Windows XP) で両方のテストを複数回実行しましたが、結果は一貫しています。Mono フレームワークで Interlocked.Read/Interlocked.Exchange のパフォーマンスが非常に遅いように見える理由を知りたいです。

アップデート:

次の簡単なテストを書きました。

.NET フレームワークは、 と の両方で一貫して~2.5秒を返します。Mono フレームワークは~5.1秒を返します。ExchangeRead

0 投票する
3 に答える
1720 参照

c# - 方法:一度だけ呼び出すことができるスレッドセーフなメソッドを作成しますか?

(オブジェクトインスタンスごとに)一度だけ呼び出すことができるスレッドセーフなメソッドを書き込もうとしています。以前に呼び出されたことがある場合は、例外をスローする必要があります。

私は2つの解決策を考え出しました。どちらも正しいですか?そうでない場合、それらの何が問題になっていますか?

  1. lock

    /li>
  2. Interlocked.CompareExchange

    私が間違っていなければ、このソリューションにはロックフリーであるという利点があり(私の場合は無関係のようです)、必要なプライベートフィールドが少なくて済みます。

また、どの解決策を優先すべきかについての正当な意見や、より良い方法がある場合はさらに提案することもできます。

0 投票する
2 に答える
1828 参照

winapi - InterlockedCompareExchange Release()とAcquire()の違いは何ですか?

InterlockedCompareExchangeRelease()との違いは何InterlockedCompareExchangeAcquire()ですか?

WIN32 APIを使用して同期関数を学習しようとすると、名前が異なる2つの関数がありますが、同じことをしているようです。

私はMSDNをチェックします、それはそれらの関数が次のとおりであると言います:

指定された値に対してアトミックな比較交換操作を実行します。この関数は、指定された2つの32ビット値を比較し、比較の結果に基づいて別の32ビット値と交換します。

しかし、のためInterlockedCompareExchangeAcquire()に、

この操作は、メモリアクセスの取得セマンティクスを使用して実行されます。

とのためInterlockedCompareExchangeRelease()に、

交換は、リリースメモリアクセスセマンティクスを使用して実行されます。

ですから、これら2つの機能の違いに興味があります。いつメモリアクセスセマンティクスを取得するか、メモリアクセスセマンティクス解放するか。例はありますか?

ありがとう!

0 投票する
3 に答える
2353 参照

c# - 競合が最も少ないラウンドロビンスレッドシナリオの数値をどのようにインクリメントする必要がありますか?

多くのスレッドがGetNextNumber次のコードと同時に呼び出している場合、GetNextNumberは他のどの番号よりも1回多く返されます。

ロックを使用せずに、_lastNumber元に戻して、スレッド呼び出しごとに増分された数を確実に返す方法はありますか?GetNextNumber()

0 投票する
0 に答える
158 参照

visual-c++ - 頻繁なリバース エンジニアリング

いくつかのコードをリバース エンジニアリングして、共通のパターンに何度も遭遇しようとしていますが、それが何であるかはわかりません。コードは VC++ 2010 でコンパイルされており、表示用にいくつかの外部 CLR コンポーネントを使用しています (ただし、私が知る限り、内部用ではありません)。

オブジェクトを返すいくつかの関数に見られるパターンのいくつかは、次のいずれかです。

  • InterlockedIncrement返品するobj_ptr - 12前に行う
  • InterlockedDecrementonの結果を確認しobj_ptr - 12、結果が 0 の場合は呼び出します*(*(obj_ptr - 24) + 64)(obj_ptr - 24)

デストラクタへの熱心な呼び出しによる参照カウントに基づくGCのように見えます。これが正しいかどうか、誰かが確認できますか、それとも他のシステムですか?

もしそうなら - 私が見ることができる既知のインターフェースはありますか? 値を返す前に Increment を実行する場所が、そのタイプの「新しい」の拡張バージョンであると想定できるかどうかを知りたいです。

また、これに関する詳細情報はどこで入手できますか? これは、標準オブジェクトの vtable の一部にすることはできないようです。これは、先頭の短いポインターであると予想されます。RTTI かもしれませんが、そのレイアウトの良い例が見つかりませんでした。ここで、基本クラスをさらに移動する多重継承は期待していません。

0 投票する
2 に答える
506 参照

c# - この C# ユーティリティ クラスを使用して、Interlocked 経由でスレッドを制御する必要がある場合と使用しない場合

このクラスがどのように作成されたか、またいつ使用すべきか、使用すべきでないかについてのロジックを理解しようとしています。どんな洞察もいただければ幸いです

更新: ソース コードで使用例を見つけました...これは、上記のオブジェクトの使用方法を示していますが、「理由」はわかりません。

0 投票する
2 に答える
3121 参照

c# - スレッドプールはタイマーのコールバック関数をキューに入れ、同時に複数のスレッドをスケジュールすることがありますか?

次のコードTimerRecalcStatisticsElapsedでは、実行中のインスタンスを 1 つだけ持つ必要があります。このコールバックが呼び出すワーカー メソッドは、一度に最大 1 つのスレッドが実行されるように、順番に実行されます。

質問パート 1:

タイマーのコールバックがスレッドプール スレッドを実行する場合 (別のスレッドでコールバックを実行するのではなく)、スレッドプールがキューに入れられ、条件に基づいて後で実行するためにスレッドを延期する可能性があると言うのは正しいですか (MaxThreads に達した、スレッドプールの内部ロジック) ?

質問パート 2:

1 つのタイマー コールバックが即時実行以外のキューに入れられる可能性があると仮定すると、それは任意の数のスレッド コールバックが同時に実行される可能性があることを意味しますか?

質問パート3

パート 2 が正しいと仮定すると、以下のコードで複数のコールバックが同時に動作する可能性があるということですか?

私が質問している理由は、マルチ CPU サーバーで実行されているこのクラスのインスタンスが数千あるためです。の順不同の操作と一致するデータ破損も見られます// Do Work Here

さておき

// Do work hereSystem.Collections.Dictionary と内部的に連携し、y の値を編集します。また、シリアルに呼び出される後続の関数のいくつかのキーも削除されます。その関数には、最初の呼び出しで以前に存在していたキー (x) がありません。これは、最終ステートメントで競合状態があるためだと思いますobj.cleanupdata()

0 投票する
1 に答える
91 参照

.net - .netSystem.MemberwiseCloneおよびインターロックされた書き込み

値型の配列のMemberwiseCloneを実行する場合:

これらのdoubleが他のスレッドでインターロックされた書き込みを使用して変更されている場合、MemberwiseClonedコピーは、その中でdoubleが破損するリスクがありますか?私はわずかに古い値を持っていることを心配していません、ただ引き裂き、インターロックされたメンバーワイズクローン間の相互作用(これはメモリブリットタイプの操作に変換されると思いますか?)

0 投票する
1 に答える
426 参照

c# - Interlocked.CompareExchangeの使用

彼ら、

以下の次のコードを評価していただきたいと思います。ご覧のとおり、私はInterlocked.CompareExchangeを使用していますが、このコンテキストでは意味がありますか?(それが正しいかどうかはわかりません)。

メモやコメントなどはよろしくお願いします。

よろしくお願いします。

0 投票する
2 に答える
1111 参照

c# - ThreadPoolスレッドがいつ完了したかを確認する正しい方法は?

スレッドプール内のすべてのスレッドがいつタスクを終了したかを確認する方法を探しています。counter == 0現在、スレッドがジョブを終了したとき、およびメソッドを呼び出しているときに減少するカウンターを使用していますWorkComplete。これは機能しているように見えますが、最終的な「ジョブ」に到達すると、結果を処理していないように見えますか? または、少なくとも UI はそれを取得しません。これが私が現在持っているものです:

ワークアイテムのキューイング + インクリメント カウンター

仕事する:

しかし、処理される URL の量は常に合計数よりも 1 少なくなります。これは、最後のスレッドが 'Reporting back' などではないようなものです。誰にもアイデアはありますか?

ありがとうございました