問題タブ [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.
c# - 他のスレッドで Interlocked によって更新された int の読み取り
(これは、Interlocked.Increment'ed int フィールドを正しく読み取る方法の繰り返しですが、回答とコメントを読んだ後でも、正しい答えがわかりません。)
私が所有しておらず、いくつかの異なるスレッドで int カウンター (numberOfUpdates) をインクリメントするロックを使用するように変更できないコードがいくつかあります。すべての呼び出しは次を使用します。
コードで numberOfUpdates を読み取りたい。これは int であるため、引き裂くことができないことがわかります。しかし、可能な限り最新の値を確実に取得するにはどうすればよいでしょうか? 私のオプションは次のようです:
または
両方とも機能しますか (最適化、並べ替え、キャッシュなどに関係なく、可能な限り最新の値を提供するという意味で)? どちらが優先されますか?より良い第 3 のオプションはありますか?
c# - Interlocked クラスを使用したロックなしのプログラミング
Interlocked クラスを使用して C# アプリケーションのロックを解除する必要があります。私はそのようなコードを持っています:
また、Interlocked クラスの ThreadProc のロックを置き換えたい場合は、次のようになります。
次のエラーが表示されます。
およびこのエラー: エラー CS1503: Argument #1' cannot convert
ulong to ref int' (CS1503) (projectx)
修正方法は?
c# - C# ++演算子はforeachループでスレッドセーフになりますか?
最近、VB から C# に移行したので、構文の違いを理解するために C# から VB.NET へのコンバーターをよく使用します。次のメソッドを VB に移行しているときに、興味深いことに気付きました。
C# の元のコード:
VB.NET の結果:
C#の++
演算子をループで使用すると、スレッドSystem.Threading.Interlocked.Increment
セーフでない演算子がスレッドセーフになるということですか? それは一種の構文糖ですか?それが本当なら、なぜコンバーターを VB バージョンに配置したのですか? C# と VB の foreach はまったく同じように機能すると思いました。それとも単なるコンバーターの「保険」ですか?++
foreach
Interlocked.Increment
c++ - リンク エラー 2001: 32 ビットから 64 ビットへの移植中に未解決の外部シンボルが発生しました
32 ビット アプリケーションを 64 ビットに移植しようとしていますが、いくつかの連動機能 ( InterlockedIncrement64
、Decrement64
、Exchange64
、CompareExchange64
および) に問題があり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 の間で変更されているかどうかも確認しました。
事前に助けてくれてありがとう。
c# - 32 ビット環境での 64 ビット変数のアトミック インクリメント
別の質問に対する回答を書いていると、興味深いことがいくつか出てきましたが、今ではInterlocked.Increment(ref long value)
32 ビット システムでどのように動作するのか理解できません。説明させてください。
32ビット環境用にコンパイルするときにネイティブInterlockedIncrement64
を使用できなくなりました.OK..NETでは必要に応じてメモリを配置できず、マネージから呼び出されて削除される可能性があるため、これは理にかなっています.
.NETではInterlocked.Increment()
、64ビット変数への参照を使用して呼び出すことができますが、その配置に関する制約はまだありません(たとえば、構造内で and を使用する場合もありますFieldOffset
)StructLayout
が、ドキュメントには制限については言及されていません(AFAIK )。それは魔法です、それはうまくいきます!
Hans Passant は、これはJIT コンパイラによって認識される特別なメソッドであり、COMInterlocked::ExchangeAdd64() への呼び出しを Interlocked.Increment()
発行し、次にInterlockedExchangeAdd64の同じ制限を共有するInterlockedExchangeAdd64のマクロであるFastInterlockExchangeAddLongを呼び出すことに注意しました。
今、私は困惑しています。
管理された環境を 1 秒間忘れて、ネイティブに戻ります。なぜ機能しInterlockedIncrement64
ないのに機能するのInterlockedExchangeAdd64
ですか?InterlockedIncrement64
はマクロです。組み込み関数が利用できず、動作する場合は、 ...InterlockedExchangeAdd64
への呼び出しとして実装できます。InterlockedExchangeAdd64
マネージドに戻りましょう: アトミック 64 ビット インクリメントは 32 ビット システムでどのように実装されるのでしょうか? 「この関数は、他のインターロックされた関数の呼び出しに関して原子的です」という文は重要だと思いますが、それを行うためのコードはまだ見当たりませんでした(より深い実装を指摘してくれたハンスに感謝します)。InterlockedExchangedAdd64
組み込み関数が利用できない場合は、WinBase.h から実装を選択しましょう。
読み取り/書き込みをアトミックにするにはどうすればよいですか?
c# - 並列ジョブ/スレッドの処理
プロジェクトをリファクタリングしようとしていますが、現在、アプリケーションのパフォーマンスを向上させる最善の方法を研究しようとしています。
質問 1. スピンロックとインターロック
カウンターを作成するには、どちらの方法がパフォーマンスが優れているか。
または
また、 のように別のカウンターをインクリメントする必要がある場合、別のオブジェクトcounter2
を宣言する必要がありますか? または別のオブジェクトSpinLock
を使用するのに十分ですか?boolean
質問 2. ネストされたタスクまたはより良い置換の処理
このアプリケーションの現在のバージョンでは、タスクを使用し、新しいタスクをそれぞれ配列に追加してから、Task.WaitAll()
多くの調査の結果、使用したParallel.ForEach
方がパフォーマンスが向上することがわかりましたが、現在のスレッドの数を制御するにはどうすればよいですか? MaxDegreeOfParallelism
パラメータで aを指定できることはわかっていParallelOptions
ますが、問題はここにあります。メソッドが実行されるたびにcrawl(url)
、別の限られた数のスレッドが作成されるだけです。つまり、MaxDegree
10 に設定すると、実行するたびcrawl(url)
に別の +10 が作成されます。どうすればこれを防ぐことができますか?Parallel の代わりにセマフォとスレッドを使用する必要がありますか? それとももっと良い方法がありますか?
質問 3. すべてのジョブ (およびネストされたジョブ) が終了したときに通知します。
最後の質問は、すべてのジョブがいつ終了したかをどのように理解できるかということです。