15

.NET DateTime スレッドセーフですか? 読み取り操作が間違った値を返すかどうかは心配していません。私の唯一の懸念は、同期されていない場合、DateTime オブジェクトが破損するかどうかです。

4

2 に答える 2

23

フィールドへの読み取りと書き込みDateTimeはアトミックではありません (少なくとも 32 ビット システムでは)。

  • 複数のスレッドから同じプロパティに同時に割り当てると、破損する可能性があります。

  • あるスレッドから読み取り、別のスレッドから書き込むと、読み取りスレッドが破損した値を取得する可能性があります。

  • 書き込みスレッドを同時に持たずに複数のスレッドから読み取ることは安全です。

基本的に、a の 2 つの 32 ビット半分にはDateTime、同時に複数のスレッドから使​​用されると、異なる年齢の値が含まれる場合があります。

2 つの書き込みを混在させることができます。1 つの書き込みの上位 32 ビット部分と、別の書き込みの下位 32 ビット部分。

Int64別の方法として、フィールドに を使用し、Threadおよびからのアトミック メソッドで作業することができますInterlocked。次に、 と を使用new DateTime(ticks)dateTime.Ticksて との間で変換しDateTimeます。

MSDN は次のように述べています。

この型のすべてのメンバーはスレッド セーフです。インスタンスの状態を変更するように見えるメンバーは、実際には新しい値で初期化された新しいインスタンスを返します。他の型と同様に、この型のインスタンスを含む共有変数の読み取りと書き込みは、スレッド セーフを保証するためにロックで保護する必要があります

この型のインスタンスの割り当ては、すべてのハードウェア プラットフォームでスレッド セーフではありません。これは、そのインスタンスのバイナリ表現が大きすぎて 1 回のアトミック操作で割り当てることができない場合があるためです。

于 2013-01-15T19:19:18.923 に答える
10

DateTime不変の値型 (構造体) です。一度作成したインスタンスは変更できません。

破損することはなく、スレッドセーフです。

DateTime 複数のスレッドから変数を変更する場合(書き込みまたは読み取り/書き込み)、同期する必要があります。この操作はスレッドセーフではないためです。

于 2013-01-15T19:16:13.297 に答える