6

http://msdn.microsoft.com/en-us/library/aa691278(VS.71).aspxを見ていますが、int の読み取りと書き込みはアトミックですが、long の読み取りと書き込みはそうではない可能性があります。それは本当に 64 ビット プラットフォームに当てはまりますか? IntPtr.Size == 64 ビットまたは long ではありませんか? 何か足りないのでしょうか、それとも言語仕様が十分ではありませんか?

ここでもより多くの考え: http://philosopherdeveloper.wordpress.com/2011/02/08/beware-assignment-atomic-assignment/

4

2 に答える 2

13

longは、 64 ビット ワードを持つCPUおよびプラットフォームでのアトミックな書き込みです。たとえば、32 ビット .NET アプリケーションを 64 ビット コンピュータで実行する場合、書き込みはアトミックでlongありません。

コンパイラがそのタイプの変数へのアクセスを最適化しないことを確認できない場合、原子性はほとんど無意味です。longたとえば、フィールドを で装飾することはできませんvolatile

64 ビット フィールドに対する操作は、64 ビット ランタイム環境でのみアトミックであることが保証されます。

http://www.albahari.com/threading/part4.aspx

CLR の 64 ビット バージョンの 64 ビット オペレーティング システムで C# コードを実行している場合、64 ビット double と long integer の読み取りと書き込みもアトミックであることが保証されます。

http://blogs.msdn.com/b/ericlippert/archive/2011/05/31/atomicity-volatility-and-immutability-are-different-part-two.aspx

于 2012-09-18T23:35:45.447 に答える
1

これは、.NET Framework 1.1 に対応する VS2003 のドキュメントです。これは、32 ビット フレーバーでのみ利用可能でした (今のところ、非常にニッチな IA-64 エディションは無視します)。

.NET Framework 2.0 では x64 エディションが導入され、(64 ビット モードで実行している限り) 特定の (すべてではない) Int64 操作がアトミックになります。

もちろん、確実にしたい場合は、Interlockedクラスを使用してください。

于 2012-09-18T23:37:07.633 に答える