IT干货网

.net之多线程和 bool 值

linjiqin 2024年10月01日 编程设计 18 0

我有一个包含像这样的 bool 字段的类:

public class MyClass 
{ 
    private bool boolVal; 
    public bool BoolVal 
    { 
        get { return boolVal; } 
        set { boolVal = value; } 
    } 
} 

可以使用该属性从多个线程读取和写入该字段。我的问题是我是否应该使用 lock 语句来隔离 getter 和 setter?或者我应该简单地使用 volatile 关键字并保存锁定?或者我应该完全忽略多线程,因为获取和设置 bool 值是原子的?

问候,

请您参考如下方法:

这里有几个问题。

先说简单。是的,读取和写入 bool 变量是一个原子操作。 (澄清:我的意思是读和写操作本身是 bool 值的原子操作,而不是读和写,这当然会生成两个操作,它们一起不会是原子的)

但是,除非您采取额外的步骤,否则编译器可能会优化掉此类读取和写入,或移动操作,这可能会使您的代码操作与您的预期不同。

将该字段标记为 volatile意味着操作不会被优化掉,指令基本上是说编译器永远不应该假设这个字段中的值与前一个相同,即使它只是在前一条指令中读取它。

但是,在多核和多 CPU 机器上,不同的内核和 CPU 的缓存中的字段可能具有不同的值,因此您添加了 lock { }子句,或任何其他强制内存屏障的东西。这将确保字段值在核心之间保持一致。此外,读取和写入不会越过代码中的内存屏障,这意味着您可以预测操作发生的位置。

因此,如果您怀疑或知道该字段将被写入多个线程并从多个线程读取,我肯定会在混合中添加锁定和 volatile 。

请注意,我不是多线程方面的专家,我可以掌握自己的方法,但我通常会进行防御性编程。可能(我认为很有可能)您可以实现不使用锁的东西(有许多无锁构造),但遗憾的是我在这个主题上没有足够的经验来处理这些事情。因此我的建议是添加 lock条款和 volatile指示。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!