問題タブ [interlocked-increment]

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 投票する
5 に答える
18914 参照

c# - 他のスレッドで Interlocked によって更新された int の読み取り

(これは、Interlocked.Increment'ed int フィールドを正しく読み取る方法の繰り返しですが、回答とコメントを読んだ後でも、正しい答えがわかりません。)

私が所有しておらず、いくつかの異なるスレッドで int カウンター (numberOfUpdates) をインクリメントするロックを使用するように変更できないコードがいくつかあります。すべての呼び出しは次を使用します。

コードで numberOfUpdates を読み取りたい。これは int であるため、引き裂くことができないことがわかります。しかし、可能な限り最新の値を確実に取得するにはどうすればよいでしょうか? 私のオプションは次のようです:

または

両方とも機能しますか (最適化、並べ替え、キャッシュなどに関係なく、可能な限り最新の値を提供するという意味で)? どちらが優先されますか?より良い第 3 のオプションはありますか?

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

c# - Interlocked クラスを使用したロックなしのプログラミング

Interlocked クラスを使用して C# アプリケーションのロックを解除する必要があります。私はそのようなコードを持っています:

また、Interlocked クラスの ThreadProc のロックを置き換えたい場合は、次のようになります。

次のエラーが表示されます。

およびこのエラー: エラー CS1503: Argument #1' cannot convert ulong to ref int' (CS1503) (projectx)

修正方法は?

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

c# - C# ++演算子はforeachループでスレッドセーフになりますか?

最近、VB から C# に移行したので、構文の違いを理解するために C# から VB.NET へのコンバーターをよく使用します。次のメソッドを VB に移行しているときに、興味深いことに気付きました。

C# の元のコード:

VB.NET の結果:

C#の++演算子をループで使用すると、スレッドSystem.Threading.Interlocked.Increment セーフでない演算子がスレッドセーフになるということですか? それは一種の構文糖ですか?それが本当なら、なぜコンバーターを VB バージョンに配置したのですか? C# と VB の foreach はまったく同じように機能すると思いました。それとも単なるコンバーターの「保険」ですか?++foreachInterlocked.Increment

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

c++ - リンク エラー 2001: 32 ビットから 64 ビットへの移植中に未解決の外部シンボルが発生しました

32 ビット アプリケーションを 64 ビットに移植しようとしていますが、いくつかの連動機能 ( InterlockedIncrement64Decrement64Exchange64CompareExchange64および) に問題がありExchangeAdd64ます。

エラー:

エラー LNK2001: 未解決の外部シンボル "_InterlockedExchange64" C:\path_to_object_file\myclass.obj

私はすでにエラーを検索し、いくつかのスレッドを見つけましたが、どれも機能していないようです。(たとえば、これを参照してください)

kernel32.lib と psapi.lib の場所 (/VERBOSE_LIB) を確認しましたが、上記のリンクの解決策は役に立ちませんでした (Project->Linker->Additional Dependencies で psapi.lib へのフル パスを指定)。

また、Vc++ ディレクトリ、特にライブラリ ディレクトリが Win32 バージョンと x64 の間で変更されているかどうかも確認しました。

事前に助けてくれてありがとう。

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

c# - 32 ビット環境での 64 ビット変数のアトミック インクリメント

別の質問に対する回答を書いていると、興味深いことがいくつか出てきましたが、今ではInterlocked.Increment(ref long value)32 ビット システムでどのように動作するのか理解できません。説明させてください。

32ビット環境用にコンパイルするときにネイティブInterlockedIncrement64を使用できなくなりました.OK..NETでは必要に応じてメモリを配置できず、マネージから呼び出されて削除される可能性があるため、これは理にかなっています.

.NETではInterlocked.Increment()、64ビット変数への参照を使用して呼び出すことができますが、その配置に関する制約はまだありません(たとえば、構造内で and を使用する場合もありますFieldOffsetStructLayoutが、ドキュメントには制限については言及されていません(AFAIK )。それは魔法です、それはうまくいきます!

Hans Passant は、これはJIT コンパイラによって認識される特別なメソッドであり、COMInterlocked::ExchangeAdd64() への呼び出しを Interlocked.Increment()発行次にInterlockedExchangeAdd64の同じ制限を共有するInterlockedExchangeAdd64のマクロであるFastInterlockExchangeAddLongを呼び出すことに注意しました。

今、私は困惑しています。

管理された環境を 1 秒間忘れて、ネイティブに戻ります。なぜ機能しInterlockedIncrement64ないのに機能するのInterlockedExchangeAdd64ですか?InterlockedIncrement64はマクロです。組み込み関数が利用できず、動作する場合は、 ...InterlockedExchangeAdd64への呼び出しとして実装できます。InterlockedExchangeAdd64

マネージドに戻りましょう: アトミック 64 ビット インクリメントは 32 ビット システムでどのように実装されるのでしょうか? 「この関数は、他のインターロックされた関数の呼び出しに関して原子的です」という文は重要だと思いますが、それを行うためのコードはまだ見当たりませんでした(より深い実装を指摘してくれたハンスに感謝します)。InterlockedExchangedAdd64組み込み関数が利用できない場合は、WinBase.h から実装を選択しましょう。

読み取り/書き込みをアトミックにするにはどうすればよいですか?

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

c# - 並列ジョブ/スレッドの処理

プロジェクトをリファクタリングしようとしていますが、現在、アプリケーションのパフォーマンスを向上させる最善の方法を研究しようとしています。

質問 1. スピンロックとインターロック

カウンターを作成するには、どちらの方法がパフォーマンスが優れているか。

または

また、 のように別のカウンターをインクリメントする必要がある場合、別のオブジェクトcounter2を宣言する必要がありますか? または別のオブジェクトSpinLockを使用するのに十分ですか?boolean

質問 2. ネストされたタスクまたはより良い置換の処理

このアプリケーションの現在のバージョンでは、タスクを使用し、新しいタスクをそれぞれ配列に追加してから、Task.WaitAll()

多くの調査の結果、使用したParallel.ForEach方がパフォーマンスが向上することがわかりましたが、現在のスレッドの数を制御するにはどうすればよいですか? MaxDegreeOfParallelismパラメータで aを指定できることはわかっていParallelOptionsますが、問題はここにあります。メソッドが実行されるたびにcrawl(url)、別の限られた数のスレッドが作成されるだけです。つまり、MaxDegree10 に設定すると、実行するたびcrawl(url)に別の +10 が作成されます。どうすればこれを防ぐことができますか?Parallel の代わりにセマフォとスレッドを使用する必要がありますか? それとももっと良い方法がありますか?

質問 3. すべてのジョブ (およびネストされたジョブ) が終了したときに通知します。

最後の質問は、すべてのジョブがいつ終了したかをどのように理解できるかということです。