この議論全体の核心は適切な配置であり、これはxxxのパーティションIのセクション' 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
クラス操作の使用による)
短い要約; アトミック性に関する限り、あなたがしていることは、読むための特別な指示を必要としない可能性が非常に高いです...しかし、あなたがしていることによっては、注意しなければならないことが他にもあるかもしれません。