1

ほとんどの場合doubledecimal64 ビット システムでのタイプの更新はアトミック操作であるため、これらのタイプは 64 ビットです。(10 進数は 128 ビットなので、これは間違っています。コメントありがとうございます)

しかし、64ビットシステムで更新double?して入力すると、アトミックになりますか? とdecimal?の大きさは?double?decimal?

そのような更新が一般的なシナリオでアトミックになるかどうかはまだ興味がありますが、アトミック性が保証されていないことは理解しています。

4

3 に答える 3

11

ほとんどの場合、64 ビット システムでの double 型と decimal 型の更新はアトミック操作であるため、これらの型は 64 ビットです。

いいえ、decimal最初は 128 ビットです。また、64 ビットコンピューターで実行しているからといって、必ずしも 64 ビット CLR を実行しているとは限りません。ここでの「システム」の意味が明確ではありません。

したがって、 のアトミック性を想定することさえすべきではありませんdecimaldouble64 ビットの CLR でも、アラインメントに依存することもあって、 の原子性に依存したくありません。C# 仕様では、次のように明示的に述べられています (C# 4 仕様のセクション 5.5)。

long、ulong、double、decimal などの他の型、およびユーザー定義型の読み取りと書き込みは、アトミックであるとは限りません。

そのため、nullable側は無意味になりますが...

しかし、二重に更新すると?そして小数?64ビットシステムで入力すると、アトミックになりますか? ダブルのサイズは?そして小数?

Nullable<T>基本的にTフィールドとboolフィールドです。したがって、ストレージは の場合は 64 ビットdouble以上、 の場合は 128 ビット以上になりますdecimal。正確なストレージはコンテキストに依存する可能性が非常に高いですが、基本的に、これらの型の操作にアトミック性は期待できません。

他の人が言ったように、保証されていないものに依存したくないことはほぼ確実です。個人的には、ほとんどの場合、一般的にロックフリー コーディングは避けようとします。CLR/BCL チームによって提供され、安全であることが証明されている高レベルの抽象化を使用するようにしてください。

于 2012-11-13T14:01:53.613 に答える
4

原子性が保証されていないことを理解しています

それでおしまい。保証はできません。

そのような更新が一般的なシナリオでアトミックになるかどうか、私はまだ興味があります。

保証はできません。

マークが言ったように。

于 2012-11-13T14:02:15.027 に答える
1

C#仕様では、64ビット変数を2つの32ビット変数として書き込むことができます。

C#言語は、2つのintに次々に書き込むのと同等の長さで書き込む権利を留保し、実際には、一部のチップはそのように実装します。

EricLippertの詳細はこちら

于 2012-11-13T14:10:07.533 に答える