gpt4 book ai didi

c# - 为什么这里要用锁?

转载 作者:太空狗 更新时间:2023-10-29 22:37:00 29 4
gpt4 key购买 nike

我目前正在阅读 Joe Albahari 的 Threading in C#电子书,有时在他的示例代码中,他在我看不到任何线程安全问题的地方使用锁。 Here ,例如,他锁定了对 _status 字段的写入和读取,该字段指的是一个不可变对象(immutable对象)。

我知道如果 ProgressStatus 类是可变的,您将需要锁定读取和写入它,因为如果一个线程在更新 PercentComplete 和 StatusMessage 字段之间被抢占另一个线程读取状态,第二个线程可能会得到这些字段的一对无效值。 (100% 完成/“正在进行操作...”)

但由于 ProgressStatus 是不可变的,因此不会出现此类无效状态。如果 Joe 删除了这两个锁,会出现什么线程安全问题?

最佳答案

If Joe removed both of those locks, what thread safety issue could arise?

它可能导致“陈旧数据”,读取代码可以缓存它并且只能看到旧值。

lock 的这种用法是非典型的,它利用了 lock 的副作用:它有一个隐含的内存屏障,可以防止看到一个旧副本。您通常会看到 volatile ProgressStatus _status;,但 volatile 也有其问题。

你是对的,实际的读写操作在这里并不真的需要锁(访问引用是原子的)。

关于c# - 为什么这里要用锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584985/

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