InterlockedIncrement対++
-
11-09-2019 - |
質問
どのようInterlockedIncrementは動作しますか?
唯一のマルチプロセッサシステム上の懸念ですか?
これは何をするのか、すべてのプロセッサ間での割り込みを無効にする?
解決
jcopenhaは正しいですが、私はちょうどに答えたかった「だけで、マルチプロセッサシステム上の懸念ですか?」
私はあなたが使用しているInterlocked
知りません。あなたがC ++ 1を意味している場合、xはあなたの「bit化」よりも大きくない場合には、シングルコアのあなたは「X ++」を行うに安全「でなければなりません」。私は、コンパイラが関数内のいくつかの奇妙な方法でそれを最適化することができるので、「あるべき」書き込み - 2「++ X」の例の変更のために「を追加...、2を」完全に別の場所に通常とあなたのマルチスレッドの一部ロジックは、そのため失敗することがあります。マルチコアでは、32ビットx上でも++ xは、あなたは、命令が「株式会社MEM」、または「INC MEMをロック」、それがロックされていないときは、二つのCPUから1つのMEMアドレスをインクリメントするときすることができます(奇妙な効果を持つことができます)奇妙な結果を得ることができます。
あなたのXの「bit化は、」あなたのCPUよりも高い場合、あなたは任意のマルチスレッドコードに連動必要が - それはシングルまたはマルチコアだ場合、その命令はとにかく2つのasmコードにコンパイルする必要があるため、問題ではないとコンテキストスイッチが間に起こるかもしれません。 (これはRCUしかしで固定することができる)
.NETでは、それは基本的に同じ話だが、あなたの代わりにインターロックのインクリメント、...と、インターロック... 64をオーバーロードしています。
そうそう - あなたが(でもシングルコア上)マルチスレッドのものを書く時はいつでも、ちょうど共有メモリ上の連動増分を使用しています。ここは、マシンよりも「賢く」であることを試してみる価値はありません。
他のヒント
InterlockedIncrement原子方法で値をインクリメントし、格納するマシンレベルの命令を使用して動作します。何も操作を意味しないが処理中の値と格納位置で行うことができる。
これは、いつでも複数のスレッドまたはプロセスまたは同じ値にアクセス懸念されます。複数のプロセスのように、マルチスレッドアプリケーションで共有変数、または共有メモリ
私は、少なくとものx86タイプのハードウェア上で、命令は割り込みを無効に信じていません。
InterlockIncrementは間違いなくあなたは、パフォーマンスを懸念している場合に移動するための方法である:InterlockIncrementは、変数が参照(Interlocked.Increment(REF増分))によって渡された渡しアトミック操作(MSDN)として、指定された変数をインクリメントし、その結果を保存します。 ++では、値をメモリ内の往復に命令が呼び出されるたびに、原因となるアドレスで渡されます。