gpt4 book ai didi

c# - .NET C# 多线程

转载 作者:太空狗 更新时间:2023-10-29 19:40:04 25 4
gpt4 key购买 nike

关于线程的问题满足我的好奇心...

假设我有静态变量 _status (ProgressStatus),许多线程正在从中读取。为了更新这个静态变量,我使用了一个不可变对象(immutable对象) ProgressStatus,创建了一个新实例,然后换掉了引用。

var status = new ProgressStatus (50, "Working on it"); //plus many more fields in constructor

lock (_statusLocker) _status = status; // Very brief lock

这是阅读代码

public GetProgressStatus () {

var status = new ProgressStatus (_status.ID, _status.Description);
return status }

如果我不应用锁,可能发生的最坏情况是什么?

最佳答案

其他线程可能看不到新值。

事实上,除非他们也锁定,否则他们仍然可能看不到新值。

即使引用将自动更新(即它永远不会是旧值和新值的混合值),这也没有说明更改何时对其他线程可见 - 或者其他线程何时甚至会麻烦检查。 (例如,一个线程可能已将值缓存在寄存器中,并且没有任何迹象表明该线程需要检查主内存,它可能不会这样做。)

通过将变量声明为 volatile 可能会避免这种情况 - 但老实说,我已经不再相信我完全理解 volatile 的含义。

在处理共享可变数据(读取 写入)时始终如一地使用锁可以使这个问题因锁定语义而消失。以无锁且保证正确的方式进行操作需要对正在发生的事情有相当深入的了解。 (注意这里是可变的变量,即使它引用的对象不是。)

关于c# - .NET C# 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4286147/

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