このオンラインブックによると、C#のvolatile
キーワードは、書き込み操作の後に読み取り操作が続く順序を変更することを防ぎません。a
これは、とが次のように設定されているにもかかわらず、との両方b
がに設定される可能性があるこの例を示しています。0
x
y
volatile
class IfYouThinkYouUnderstandVolatile
{
volatile int x, y;
void Test1() // Executed on one thread
{
x = 1; // Volatile write (release-fence)
int a = y; // Volatile read (acquire-fence)
...
}
void Test2() // Executed on another thread
{
y = 1; // Volatile write (release-fence)
int b = x; // Volatile read (acquire-fence)
...
}
}
これは、仕様が10.5.3で述べていることと一致しているようです。
揮発性フィールドの読み取りは、揮発性読み取りと呼ばれます。揮発性読み取りには「取得セマンティクス」があります。つまり、命令シーケンスでメモリへの参照の後に発生するメモリへの参照の前に発生することが保証されています。
揮発性フィールドの書き込みは、揮発性書き込みと呼ばれます。揮発性書き込みには「リリースセマンティクス」があります。つまり、命令シーケンスの書き込み命令の前のメモリ参照の後に発生することが保証されています。
これの理由は何ですか?書き込みと読み取りの操作が並べ替えられてもかまわないユースケースはありますか?