値をインクリメントする場合:
手動インクリメント は、アトミックであることが保証されることはありません。x86 でも x64 でもありません。ロード、ロード、追加、ストアの 4 つの操作です。JIT は load-constant-1 ( ldc_i4_1
/ ldc_i8
) を見つけて、少し単純にするかもしれませんが、基本的に、それは単一のアトミック操作ではありません。マルチスレッド コードでは、ある種のロック コンストラクトを使用するか、Interlocked
.
アトミック性の再割り当て (別名、引き裂かれた値):
(etc)に対する操作はint
、言語仕様によってアトミックであることが保証されています。long
(等)での動作は保証しておりません。はい、 x64 ではアトミックである可能性が高いですが、問題は次のとおりです。スレッド化を扱うとき、実装、つまり何が起こるかを見ません。これは保証されていないためです。おそらく、このコードが意図したとおりに動作することを気にかけているでしょう。そのような IMO として、保証されているものだけに関心を持つ必要があります。つまり、 (etc) がアトミックであることに依存することはできません。long
代わりに、、などを使用しInterlocked.Increment
ますInterlocked.Add
。