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

で宣言_connSharedDisposedした場合はvolatile、を使用する必要はありませんMemoryBarrier

volatileフィールドへのすべての書き込みを揮発性の書き込みにし、フィールドへのすべての読み取りを揮発性の読み取りにします。これは、フィールドへのアクセスの順序が相互に同じままになるように、コンパイラが命令を並べ替えることができないことを意味します。

x86以外のプロセッサでvolatileは、CPUにキャッシュされた書き込みがRAMにフラッシュされます。x86用にコンパイルする場合、volatileコンパイラの最適化にのみ適用されます。

何かが起こるまで単一のスレッドを待機状態にしようとしているのであれば、代わりに自動リセットイベントを使用できます。 AutoResetEventこれをモデル化するクラスです。複数のスレッドが待機を停止できるようにする場合は、手動リセットイベントの方が適している場合があります。 ManualResetEventまたはManualResetEventSlim(.NET 4.0以降)は、それをモデル化するクラスです。

于 2012-08-21T22:54:02.757 に答える