0

我有这样的代码:

.....
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可能会重新安排和接收。可能吗?如果我的代码不起作用如何修复它?我想我可能应该插入 MemoryBarrier 来阻止“重新排列”true_connShared.Dispose()

也可能我应该使用AutoResetEvent而不是bool volatile变量...

4

1 回答 1

2

如果您已声明_connSharedDisposedwith volatile,则无需使用MemoryBarrier.

volatile使对字段的每次写入都是易失性写入,对字段的每次读取都是易失性读取。这意味着编译器无法对指令重新排序,以使对该字段的访问顺序相对于彼此保持相同。

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

如果您要做的是使单个线程进入等待状态,直到发生某些事情,那么您可以使用自动重置事件来代替。 AutoResetEvent是模拟这个的类。如果您想允许多个线程停止等待,手动重置事件可能是更好的选择。 ManualResetEventManualResetEventSlim(在 .NET 4.0 或更高版本中)是为其建模的类。

于 2012-08-21T22:54:02.757 回答