多线程场景下的布尔值属性
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 的一些其他共享状态,它可能不是。
在多线程场景中,声明一个 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 的一些其他共享状态,它可能不是。