InterlockedIncrement はどのように機能しますか?
問題はマルチプロセッサ システムだけですか?
すべてのプロセッサで割り込みを無効にするのは何ですか?
InterlockedIncrement はどのように機能しますか?
問題はマルチプロセッサ システムだけですか?
すべてのプロセッサで割り込みを無効にするのは何ですか?
InterlockedIncrement は、マシン レベルの命令を使用して、アトミックな方法で値をインクリメントおよび格納することによって機能します。つまり、プロセス中に値と保存場所に対して操作を実行することはできません。
複数のスレッドまたはプロセス、または同じ値へのアクセスはいつでも懸念されます。つまり、マルチスレッド アプリケーションの共有変数、または複数のプロセスの共有メモリです。
少なくともx86タイプのハードウェアでは、命令が割り込みを無効にするとは思わない。
jcopenhaは正しいですが、「懸念はマルチプロセッサシステムだけにあるのでしょうか?」と答えたかっただけです。
どちらを使っているのかわかりませんInterlocked
。c ++を意味する場合、シングルコアでは、xが「ビット数」より大きくない場合は「++x」を実行しても「安全」である必要があります。コンパイラが関数内で奇妙な方法で最適化できるため、「should be」と記述します。たとえば、2つの「++x」を完全に異なる場所で通常の「add...、2」に変更し、マルチスレッドの一部を使用します。そのため、ロジックが失敗する可能性があります。マルチコアでは、32ビットxの++ xでさえ奇妙な影響を与える可能性があります(命令は「incmem」または「lockinc mem」であり、ロックされていないときに2つのCPUから1つのmemアドレスをインクリメントすると奇妙な結果が得られます)。
xの「ビット数」がCPUよりも高い場合は、マルチスレッドコードでインターロックする必要があります。シングルコアかマルチコアかは関係ありません。その命令はとにかく2つのasmコードにコンパイルする必要があり、コンテキストスイッチが必要になるためです。間に発生する可能性があります。(ただし、これはRCUで修正できます)
.NETでも基本的に同じ話ですが、Interlocked...とInterlocked... 64ではなく、Incrementをオーバーロードしています。
つまり、マルチスレッドのものを作成するときはいつでも(シングルコアでも)、共有メモリでインターロックされた増分を使用するだけです。ここで機械よりも「賢く」しようとする価値はありません。