C#仕様(ECMA-334およびISO / IEC 23270)には、読み取りと書き込みの原子性に関する段落があります。
12.5変数参照のアトミシティ
次のデータ型の読み取りと書き込みはアトミックである必要があります:bool、char、byte、sbyte、short、ushort、uint、int、float、および参照型。さらに、前のリストの基になる型を持つ列挙型の読み取りと書き込みもアトミックである必要があります。long、ulong、double、decimalなどの他のタイプの読み取りと書き込み、およびユーザー定義タイプは、アトミックである必要はありません。
しかし、私はそれが常に真実であると想像するのに苦労しています。たとえば、StructLayout
属性を使用して構造体をレイアウトし、フィールドを強制的に非整列にすることができます。
// 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など)?いずれにせよ、これをバックアップするためのソースはありますか?