次のようなコードで、Proc1 と Proc2 が異なるプロセッサで同時に実行される場合、ThingVal2 が 5 以外の値 (ゼロなど) を取得することは可能ですか?
クラス SimpleThing
Public X As Integer
Sub New (整数としての ByVal 値)
X = 値
サブ終了
クラス終了
クラス ConcurrencyTest
Dim Thing1 を新しい SimpleThing として (5)
Dim Thing2 を新しい SimpleThing として (0)
Dim ThingRef を SimpleThing = Thing1 として
Dim ThingVal1、ThingVal2 を整数として
サブ Proc1()
Thing2.X = 5
Threading.Thread.MemoryBarrier()
ThingRef = Thing2
サブ終了
サブ Proc2()
ThingVal1 = Thing2.X
ThingVal2 = ThingRef.X
サブ終了
クラス終了
IA64 のような弱いモデルでは、Proc2 が ThingRef が変更されたと認識しても、Thing2 のフィールド X が変更されたと認識しない可能性が実際にあることを私は知っています。x86 または x64 で実行されている .Net アプリケーションにそのリスクは存在しますか? Proc1 が SimpleThing の新しいインスタンスを作成し、その X フィールドを 5 に設定し、ThingRef をそれを指すように設定した場合、危険を回避するにはそれで十分であるか、または新しい Thing がキャッシュ ラインに割り当てられる可能性があります。 Proc2 スレッドがアクセスした他の何かと共有されましたか?
マルチスレッド コードの一般的なパラダイムは、不変オブジェクトを構築し、それを指す可変参照を設定することです (おそらく Interlocked.CompareExchange を使用します)。x86/x64 では、スレッドに関係なく不変型を読み取ることは常に安全ですか?それとも問題を引き起こす可能性がありますか? 後者の場合、信頼できる動作を保証するためにvb.netで推奨される方法は何ですか?
また、そのような問題が発生しない方法でコードを実行する必要があることを指定する方法はありますか?