gpt4 book ai didi

c# - 锁定对 bool 的访问是必需的还是 Overkill

转载 作者:可可西里 更新时间:2023-11-01 08:22:12 28 4
gpt4 key购买 nike

我有一个主要设计为 POCO 类的类,有各种线程和任务可以读取它的值,只有其他人只是偶尔更新这些值。这似乎是 ReaderWriterLockSlim 的理想方案。

问题是,在类中,如果需要线程安全的属性,如果属性是bool,是不是有点大材小用了?如果它是一个 int 会怎样?日期时间?

public class MyClass
{
private bool _theValue = false;
private ReaderWriterLockSlim _theValueLock = new ReaderWriterLockSlim();

public bool TheValue
{
get
{
bool returnVal = false;
try
{
_theValueLock.EnterReadLock();
returnVal = _theValue;
}
finally
{ _theValueLock.ExitReadLock(); }
return returnVal;
}
set
{
try
{
_theValueLock.EnterWriteLock();
_theValue = value;
}
finally
{ _theValueLock.ExitWriteLock(); }
}
}
}

所有这些代码都是矫枉过正吗,一个简单的......

public bool TheValue { get; set; }

...就足够了吗?因为Type是bool,安全吗?如果是这样,它什么时候变得不安全?字节?诠释?日期时间?

编辑
我的基本架构是让这个类存储状态。也许有一项服务负责对此类进行写入。所有其他类都可以基于此状态数据读取和执行它们的逻辑。我会尽最大努力确保所有数据一致,但如下所述,我主要关心的是数据的原子性和拆分。

结论
感谢大家的回复,都很有值(value)。我主要关心的是写/读的原子性(即担心拆分)。对于 .NET 平台,如果所讨论的变量是小于 4 字节的内置值类型,则读写是原子的(例如,short 和 int 可以,long 和 double 则不行)。

最佳答案

根据其使用方式,您可能需要标记 bool 值 volatile .这将需要您的属性(property)的支持字段。

您不需要像现在这样使用 ReaderWriterLockSlim 来处理它,因为它小于 32 位(假设您正在使用 AutoLayout,有关详细信息,请参阅 this post 或者,对于最详细的,ECMA 335 规范中标题为 内存访问的原子性 的部分)。如果您使用的类型大于此,则需要某种形式的同步。

我会推荐:

public class MyClass
{
private volatile bool _theValue = false;
public bool TheValue
{
get { return _theValue; }
set { _theValue = value; }
}
}

关于c# - 锁定对 bool 的访问是必需的还是 Overkill,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433374/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com