多线程场景下的布尔值属性

Boolean property in a multithreaded scenario

在多线程场景中,声明一个 class 的布尔值 属性 是否有意义,在 C# .net 中以下列方式同时读取和设置多个线程?

public class MyClass 
{
    private long _check;

    public bool Check 
    {
        get => Interlocked.Read(ref _check) == 1;
        set => Interlocked.Exchange(ref _check, Convert.ToInt64(value));
    }
}

您对可变 bool 字段的实现过于复杂。你可以像这样实现完全相同的事情:

private bool _check;

public bool Check
{
    get => Volatile.Read(ref _check);
    set => Volatile.Write(ref _check, value);
}

...或者像这样更简单:

public volatile bool Check;

Interlocked.Exchange 仅当您希望将先前的值作为原子操作获取时,才比 Volatile.Write 更可取。否则 Volatile.Write has the same effect and it's more lightweight.

拥有这样一个字段是否是一个好主意首先取决于场景。如果你有一个循环并且你想使用该字段作为中断机制,这可能是个好主意。如果你想同步访问你的 class 的一些其他共享状态,它可能不是。