gpt4 book ai didi

C# 和 bool 的线程安全

转载 作者:可可西里 更新时间:2023-11-01 03:05:16 29 4
gpt4 key购买 nike

我对这个主题很困惑——读取/切换 bool 值是否是线程安全的。

    // case one, nothing
private bool v1;
public bool V1 { get { return v1; } set { v1 = value; } }

// case two, with Interlocked on set
private int v2;
public int V2 { get { return v2; } set { Interlocked.Exchange(ref v2, value); } }

// case three, with lock on set
private object fieldLock = new object();
private bool v3;
public bool V3 { get { return v3; } set { lock (fieldLock) v3 = value; } }

它们都是线程安全的吗?

编辑

据我所读(click),bool 的原子性并不能保证它是线程安全的。那么 volatile 类型会有帮助吗?

最佳答案

不,不是所有的都是线程安全的。

第一种情况实际上并不是完全线程安全的,或者更确切地说 - 它根本不是线程安全的。即使 bool 运算是原子操作,变量值也可以存储在缓存中,因此,在多核 CPU 中,每个内核都有自己的缓存,值可能会被破坏。

更进一步,编译器和 CPU 可以执行一些内部优化,包括指令重新排序,这会对您的程序逻辑产生有害影响。

您可以添加 volatile 关键字,以通知编译器该字段用于多线程上下文。它将解决缓存和指令重新排序的问题,但不会为您提供真正的“线程安全”代码(因为写操作仍然不会同步)。此外,volatile 不能应用于局部变量。

因此,在处理多线程时,您总是必须在宝贵的资源上使用一些线程同步技术。

有关更多信息 - 阅读 this答案,其中对不同的技术有更深入的解释。 (示例中有关于 int 的内容,但这并不重要,它描述了一般方法。)

关于C# 和 bool 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29411961/

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