我应该插入MemoryBarrier吗?

时间:2012-08-21 12:14:58

标签: c# multithreading

我有这样的代码:

.....
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变量...

1 个答案:

答案 0 :(得分:2)

如果您使用_connSharedDisposed宣布volatile,则无需使用MemoryBarrier

volatile每次向字段写入一个易失性写入,并且每次向字段读取一次易失性读取。这意味着编译器无法重新排序指令,因此对字段的访问顺序保持相同。

在x86以外的处理器上,volatile也会导致任何CPU缓存写入刷新到RAM。如果编译为x86,则volatile仅适用于编译器优化。

如果你要做的是让一个线程进入等待状态直到发生某种情况,那么你可以使用自动重置事件。 AutoResetEvent是对此进行建模的类。如果要允许多个线程停止等待,手动重置事件可能是更好的选择。 ManualResetEventManualResetEventSlim(在.NET 4.0或更新版本中)是对其进行建模的类。