64ビットOSと64ビットCPUで読み取り/書き込みアトミックを実現するには、double変数またはlong変数を揮発性として宣言する必要がありますか?32ビットOSと32ビットプロセッサでも同じです。
2 に答える
4
これには 2 つの答えがありますが、どちらも聞きたいことではありません。
- いいえ、原子性を保証しない
volatile
ため、原子性が必要な場合は役に立ちません。volatile
- の有無にかかわらず
volatile
、アトミック性は実際には実装定義です。ほぼすべての CPU で、ネイティブのワードサイズの変数はアトミックに読み書きされます (少なくとも、適切に配置されている場合は、通常はそうなります)。x86 では、小さいものもアトミックにアクセスされます。そうです、x86 では 32 ビット変数はアトミックに読み書きされ、x86 では 64 ビット変数もアトミックに読み書きされます。ただし、これも CPU (およびコンパイラ) に依存します。
于 2012-04-15T10:55:59.477 に答える
0
volatile
ここでは役に立ちません。操作が非アトミックである場合は、同時アクセスの問題を防ぐために完全なロックが必要です。
そうは言っても、32ビットシステムでの変数のティアリングはlong
よく知られている問題であり、これを示す例を見つけることができます (以下のリンクを参照)。
double
変数もティアリングを引き起こす可能性がありますが、x86 システムでは浮動小数点ユニット レジスタが 80 ビットであるため、複製が少し難しくなります。ここを見てください: Hans Passant による優れた回答については、C# で double を引き裂くようにシミュレートしてください。
于 2012-04-15T13:15:53.030 に答える