如果我只是想以线程安全的方式测试和设置标志,那么线程类是什么?

Toa*_*oad 5 .net c# multithreading synchronization

我只是想做一个简单但通过线程安全的布尔测试(和设置),所以:

if(myBoolean==false)   //should not lock/wait!
{ 
     myBoolean=true;
     .....
}
else
{
     ....
}
Run Code Online (Sandbox Code Playgroud)

我考虑过以下(虽然可能不正确,所以请在我误解的地方纠正我)

  • 使用Lock {if(myBoolean)...}构造看起来像是一种过度的方法.并且,它还在等待锁定变为空闲时锁定线程.我不想要这个.
  • AutoResetEvent类确实具有布尔状态的概念,但它用于指示正​​在等待的另一个线程.所以与我的情况无关
  • 信号量类有一个引用计数的概念(可能会限制对资源的访问量?).所以可能不是我追求的.
  • 互斥类.据我所知,这与Lock原语相同

任何人都知道以有效的方式执行此操作的类/构造是什么?

Sam*_*ell 6

答案(Intelocked.CompareExchange)已经给出,但这是我的用法示例:

private int _isDisposing;

public bool IsDisposing
{
    get
    {
        return this._isDisposing != 0;
    }
}

public void Dispose()
{
    // Side note: I may want to `return` instead of `throw`
    if (Interlocked.CompareExchange(ref _isDisposing, 1, 0) != 0)
        throw new InvalidOperationException("Dispose was recursively called.");

    try
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    finally
    {
        _isDisposing = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)