gpt4 book ai didi

c# - 使类的属性线程安全的最佳实践是什么?

转载 作者:太空狗 更新时间:2023-10-29 19:44:07 24 4
gpt4 key购买 nike

[编辑:看起来原来的问题涉及 double 而不是整数。因此,如果我们将整数更改为 double ,我认为这个问题成立。]

我很少遇到从多个线程中使用的类读取整数属性的问题,该类有时会返回零值。这些值在初始化后不会更改。

question解决这个问题。共识是,即使我正在访问一个整数,我也需要同步属性。 (部分原答案已被删除)。我还没有在那里选择答案,因为我还没有解决我的问题。

所以我对此做了一些研究,但我不确定要使用哪种 .Net 4 锁定机制,或者锁定是否应该在类本身之外。

这是我考虑使用的:

  public class ConfigInfo
{
private readonly object TimerIntervalLocker = new object();
private int _TimerInterval;
public int TimerInterval
{
get
{
lock (TimerIntervalLocker) {
return _TimerInterval;
}
}
}

private int _Factor1;
public int Factor1
{
set
{
lock (TimerIntervalLocker) {
_Factor1 = value;
_TimerInterval = _Factor1 * _Factor2;
}
}
get
{
lock (TimerIntervalLocker) {
return _Factor1;
}
}
}

private int _Factor2;
public int Factor2
{
set
{
lock (TimerIntervalLocker) {
_Factor2 = value;
_TimerInterval = _Factor1 * _Factor2;
}
}
get
{
lock (TimerIntervalLocker) {
return _Factor2;
}
}
}
}

但我读到这太慢了。

另一种选择是在用户端锁定 ConfigData 的实例,但这似乎需要很多工作。我见过的另一种选择是 Monitor.EnterMonitor.Exit 但我认为 Lock 是相同的东西,语法更少。

So what is a best practice for making a class's properties thread safe?

最佳答案

一个。使用锁可能会很慢,因为它使用操作系统资源,如果属性的复杂性较低,那么自旋锁(或 interlocked.compareexchange)会更快。

您必须确保线程不会进入锁定状态,并且不会通过从一个属性到另一个属性的调用而被锁定。 - 如果这可能发生(当前不是您代码中的问题),您需要使锁定线程或任务敏感。

编辑:

如果对象应该在初始化期间设置并且永远不会更改,请使其不可变(就像 .NET 字符串一样)。删除所有公共(public) setter 并为构造函数提供用于定义初始状态的参数,以及可能用于创建具有修改状态的新实例的其他方法/运算符(例如 var newString = "Old string"+ "was modified.";)。

关于c# - 使类的属性线程安全的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19544081/

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