2

64ビットOSと64ビットCPUで読み取り/書き込みアトミックを実現するには、double変数またはlong変数を揮発性として宣言する必要がありますか?32ビットOSと32ビットプロセッサでも同じです。

4

2 に答える 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 に答える