2

Int32 と Int64 の操作は、.Net の 64 ビット システムでは本当にアトミックです (つまり、アセンブリ/アプリケーションは 64 ビットとしてコンパイルされます)。

本当?

MSDN の引用が見つからないので、ここで質問したいと思います。

Interlocked クラスを使用して、複数のスレッドから Int32 の値をチェックしてデクリメントするかどうかを考えており、64 ビット アプリケーションとしてコンパイルしています。

MSDN のこれらのメソッドのドキュメントには少し助けがありますが、正しく理解できたかどうかはわかりません。

ありがとう

4

1 に答える 1

4

値をインクリメントする場合:

手動インクリメント 、アトミックであることが保証されることはありません。x86 でも x64 でもありません。ロード、ロード、追加、ストアの 4 つの操作です。JIT は load-constant-1 ( ldc_i4_1/ ldc_i8) を見つけて、少し単純にするかもしれませんが、基本的に、それは単一のアトミック操作ではありません。マルチスレッド コードでは、ある種のロック コンストラクトを使用するかInterlocked .

アトミック性の再割り当て (別名、引き裂かれた値):

(etc)に対する操作はint、言語仕様によってアトミックであることが保証されています。long(等)での動作は保証しておりません。はい、 x64 ではアトミックである可能性が高いですが、問題は次のとおりです。スレッド化を扱うとき、実装、つまり何が起こるかを見ません。これは保証されていないためです。おそらく、このコードが意図したとおりに動作することを気にかけているでしょう。そのような IMO として、保証されているものだけに関心を持つ必要があります。つまり、 (etc) がアトミックであることに依存することはできません。long

代わりに、、などを使用しInterlocked.IncrementますInterlocked.Add

于 2012-08-28T11:46:56.180 に答える