在下面这段代码中,如果Proc1和Proc2在不同的处理器上同时执行,ThingVal2是否可能得到一个除5以外的值(例如0)?
多线程代码的常见范式是构建一个不可变对象并设置可变引用指向它(可能使用Interlocked.CompareExchange)。在x86 / x64下,无论线程如何,读取不可变类型是否总是安全的,还是可能会出现问题?如果是后者,那么在vb.net中保证可靠行为的首选方式是什么?
此外,是否有任何方法可以指定代码必须以无法发生这种问题的方式运行(例如,在像IA64这样的处理器上将执行限制为单个核心,否则不能保证正确操作)?
Class SimpleThing Public X As Integer Sub New(ByVal value As Integer) X = value End Sub End Class Class ConcurrencyTest Dim Thing1 As New SimpleThing(5) Dim Thing2 As New SimpleThing(0) Dim ThingRef As SimpleThing = Thing1 Dim ThingVal1, ThingVal2 As Integer Sub Proc1() Thing2.X = 5 Threading.Thread.MemoryBarrier() ThingRef = Thing2 End Sub Sub Proc2() ThingVal1 = Thing2.X ThingVal2 = ThingRef.X End Sub End Class我知道在像IA64这样的弱模型中,Proc2看到的ThingRef可能已经改变,但是没有看到Thing2的X字段已经改变。那么在x86或x64上运行的.NET应用程序是否存在此风险?如果Proc1创建了一个新的SimpleThing实例,将其X字段设置为5,然后将ThingRef设置为指向它,那么这是否足以避免危险,还是可能会分配新的对象与Proc2线程访问的其他内容共享缓存行?
多线程代码的常见范式是构建一个不可变对象并设置可变引用指向它(可能使用Interlocked.CompareExchange)。在x86 / x64下,无论线程如何,读取不可变类型是否总是安全的,还是可能会出现问题?如果是后者,那么在vb.net中保证可靠行为的首选方式是什么?
此外,是否有任何方法可以指定代码必须以无法发生这种问题的方式运行(例如,在像IA64这样的处理器上将执行限制为单个核心,否则不能保证正确操作)?