この全体の議論の核心部で、XXXのパーティションIにdevinedされる適切な位置合わせ、ある「12.6.2 Alignment
」
Built-in datatypes shall be properly aligned, which is defined as follows:
• 1-byte, 2-byte, and 4-byte data is properly aligned when it is stored at
a 1-byte, 2-byte, or 4-byte boundary, respectively.
• 8-byte data is properly aligned when it is stored on the same boundary
required by the underlying hardware for atomic access to a native int.
は基本的に、すべての32ビット値が必要な配向性を有し、オン64ビットプラットフォームでは、64ビット値も必要な整列を持っています。
ただし、:メモリ内のクラスのレイアウトを明示的に変更する属性があります。これにより、この配置が失われる可能性があります。これらは、この目的のために特別な属性ですが、レイアウトを変更するように設定していない限り、これはあなたには当てはまりません。
このようにして、Interlocked
クラスの目的は、(言い換えれば)「前」または「後」の状態でしか観察できない操作を提供することです。インターロックされた演算は、通常はメモリを変更するときにのみ問題になります(通常、ある種の単純な比較交換型の方法で)。見つかったMSDNの記事に示されているように、読み取り操作(適切に配置されている場合)は、それ以上の予防措置を講じることなく常時アトミックと見なすことができます。読み取り操作を扱う際に
しかし、他の考慮事項があります、現代のCPU上で
- 読み取りは原子かもしれないが、それはまたどこかに古いキャッシュから間違った値を返すことがあります...これはどこです
- 32ビットハードウェアで64ビットの値を扱う場合は、全体を 64に保証するには、
Interlocked.Read
オペレーションを使用する必要があります。ビット値は単一のアトミック操作で読み取られます(そうでなければ、2つの別々の32ビット読み取りとして実行される可能性があります。
- 読み取り/書き込みの順序を変更すると、期待した値が得られない可能性があります。その場合、いくつかのメモリ・バリアは、(明示的、又は
Interlocked
クラス操作の使用を介してのいずれか)
要約必要とされるかもしれません。あなたがしていることは、読んで特別な指示を必要としない可能性が非常に高いです...あなたが何をしているのかによって、注意する必要がある他のものがあるかもしれません。
ボラティリティの場合、Thread.VolatileReadファミリがあります。 –
@JS:InterlockedCompareExchange64にアドバイスした特別な理由はありますか(64に重点を置いて)? Interlocked.Readは64ビット値でも動作し、32ビットマシンで32ビット値を読み取るときにはInterlockedCompareExchnage(32ビットバージョン)が不要であることを意味する "64ビットシステムではReadメソッドは不要"と言います。 –
@Remus:Thread.VolatileReadについての良い点ですが、ドキュメンテーションでは、(あなたが意味するだろうThread.VolatileReadを指すのではなく)*心配する必要はありません。 @原因:64ビットバージョンを選択する特別な理由はありません。私は、ここで十分な微妙さがあると思うので、何もせずに逃げようとするときに必要なことを正確に主張したくないと思う。 –