我有这样的代码:
.....
private volatile bool _connSharedDisposed;
......
// Thread 1
while (!_connSharedDisposed)
{
Thread.Sleep(1);
}
CGate.Close();
......
// Thread 2
_connShared.Close();
_listenerFutInfo.Close();
_listenerFutInfo.Dispose();
_listenerFutCommon.Close();
_listenerFutCommon.Dispose();
_connShared.Dispose();
// insert Thread.MemoryBarrier here?
_connSharedDisposed = true;
我担心_connSharedDisposed = true
可能会被重新排列并在致电true
之前收到_connShared.Dispose()
。可能吗?如果我的代码不起作用如何解决它?我想我可能应该插入MemoryBarrier来阻止“重新排列”
也许我应该使用AutoResetEvent
代替bool volatile
变量...
答案 0 :(得分:2)
如果您使用_connSharedDisposed
宣布volatile
,则无需使用MemoryBarrier
。
volatile
每次向字段写入一个易失性写入,并且每次向字段读取一次易失性读取。这意味着编译器无法重新排序指令,因此对字段的访问顺序保持相同。
在x86以外的处理器上,volatile
也会导致任何CPU缓存写入刷新到RAM。如果编译为x86,则volatile
仅适用于编译器优化。
如果你要做的是让一个线程进入等待状态直到发生某种情况,那么你可以使用自动重置事件。 AutoResetEvent
是对此进行建模的类。如果要允许多个线程停止等待,手动重置事件可能是更好的选择。 ManualResetEvent
或ManualResetEventSlim
(在.NET 4.0或更新版本中)是对其进行建模的类。