.NET メモリ モデル (.NET Framework 上。compact/micro/silverlight/mono/xna/what-have-you ではない) では、特定の型 (特にプリミティブ整数と参照) の操作が保証されていることを知っています。アトミック。
さらに、x86/x64 の test-and-set 命令 (およびInterlocked.CompareExchange
) は実際にはグローバル メモリの場所を参照しているため、成功すると別の命令Interlocked.CompareExchange
が新しい値を参照することになると思います。
最後に、volatile
キーワードは、読み取りと書き込みをできるだけ早く伝達し、この変数に関する操作の順序を変更しないようにするためのコンパイラへの指示であると思います (右?)。
これにより、いくつかの疑問が生じます。
- 上記の私の信念は正しいですか?
Interlocked.Read
int のオーバーロードはなく、long (2 つの WORD であるため、通常はアトミックに読み取られません) のみです。.NET メモリ モデルでは、整数/参照を読み取るときに最新の値が表示されることが保証されていると常に想定していましたが、プロセッサ キャッシュやレジスタなどを使用すると、これが不可能になる可能性があることがわかり始めています。変数を強制的に再フェッチする方法はありますか?- volatile は、整数と参照に関する上記の問題を解決するのに十分ですか?
- x86/x64では、それを想定できます...
2 つのグローバル整数変数 x と y があり、どちらも 0 に初期化されている場合、次のように記述します。
x = 1;
y = 2;
その NO スレッドは、x = 0 および y = 2 を認識します (つまり、書き込みは順番に発生します)。それらが揮発性である場合、これは変わりますか?