C#の仕様(ECMA-334とISO/IEC 23270が)の原子についての段落の読み取りと書き込みました:変数の参照の.NETのアラインされていないフィールドへの読み取りと書き込みは絶対不可分なのでしょうか?
12.5不可分
は読み込み、次のデータ型の書き込みはアトミックでなければなりません。 bool、char、byte、sbyte、short、ushort、uint、int、float、および参照型のいずれかです。加えて、前のリストの基になるタイプの列挙型の読み書きもアトミックでなければなりません。 long型、ulong型、double型、decimal型、ユーザー定義型などの他の型の読み書きは、アトミックである必要はありません。
しかし、私はそれが常に真実であると想像しています。例えば、私はStructLayout
attributeを使用して、構造体のレイアウト、および非整列するフィールドを強制することができます:私はこれを行うとき
// sizeof(MyStruct) == 9
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
public byte pad; // Offset: 0
public int value1; // Offset: 1
public int value2; // Offset: 5
}
は今、私はそれがあるので、int
への書き込みは、アトミックないあると思うだろう自然な境界にアラインされていない:
MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;
、またはそれがアトミックであることが保証されていない(例えばx86版)?いずれにしても、これをバックアップする情報源はありますか?
ジョンは、もちろん、正確です。故意にアライメントを壊すと、故意に原子性が壊れてしまいます。あなたがそれをするときに痛いなら**それをしないでください**。 –