4

この質問は以前に尋ねられましたが、私はまだそれを完全に理解していないので、ここに行きます。

プロパティ(null許容でないdoubleまたはint)を持つクラスがある場合、複数のスレッドでプロパティを読み書きできますか?

doubleは64バイトであるため、別のスレッドに書き込まれているときに、あるスレッドでdoubleプロパティを読み取ることができることをどこかで読んだことがあります。これにより、読み取りスレッドは元の値でも新しい書き込み値でもない値を返します。

これはいつ起こりますか?intsでも可能ですか?64ビットと32ビットの両方のアプリケーションで発生しますか?

私はこの状況をコンソールで再現することができませんでした

4

2 に答える 2

3

プロパティ(null許容でないdoubleまたはint)を持つクラスがある場合、複数のtheadを使用してプロパティを読み書きできますか?

「同期なし」という意味だと思います。

doublelongは両方とも64ビット(8バイト)のサイズであり、アトミックに書き込まれることが保証されていません。したがって、バイトパターンABCD EFGHの値から、バイトパターンMNOP QRSTの値に移動する場合、(別のスレッドから)ABCDQRSTまたはMNOPEFGHが表示される可能性があります。

サイズが32ビット以下の適切に整列された値を使用すると、アトミック性が保証されます。(値が適切に整列されるという保証を見たのを覚えていませんが、属性を介して特定のレイアウトを強制しない限り、デフォルトであると思います。)C#4仕様では、アトミック性を扱うセクション5.5で整列についても言及していません。 :

次のデータ型の読み取りと書き込みはアトミックです:bool、char、byte、sbyte、short、ushort、uint、int、float、および参照型。さらに、前のリストの基になる型を持つ列挙型の読み取りと書き込みもアトミックです。long、ulong、double、decimalなどの他のタイプの読み取りと書き込み、およびユーザー定義タイプは、アトミックであることが保証されていません。その目的のために設計されたライブラリ関数を除いて、インクリメントまたはデクリメントの場合など、アトミックな読み取り-変更-書き込みの保証はありません。

さらに、アトミック性はボラティリティと同じではありません。そのため、特別な注意を払わないと、あるスレッドからの読み取りが別のスレッドからの書き込みを「認識」しない場合があります。

于 2012-06-24T06:43:36.187 に答える
1

これらの操作はアトミックではありません。そのため、InterlockedクラスはそもそもIncrement(Int32)andのようなメソッドで存在しIncrement(Int64)ます。

スレッドセーフを確保するために、より複雑なロックではないにしても、少なくともこのクラスを使用する必要があります(ReaderWriterLockSlimたとえば、プロパティのグループへのアクセスを同期する場合など)。

于 2012-06-24T06:47:51.630 に答える