gpt4 book ai didi

C#:HashSet的volatile读写

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

我有一个类:

public class Checker
{
private HashSet<int> _hs = new HashSet<int>();

public bool Check(int a)
{
return Volatile.Read(ref _hs).Contains(a);
}

public void Update(IEnumerable<int> items)
{
Volatile.Write(ref _hs, new HashSet<int>(items));
}
}

方法 Check 经常从多个线程调用。方法 Update 从监视某些源(数据库、http 服务等)的单个线程调用。这种 Volatile.Read/Volatile.Write 用法是否正确?

最佳答案

如果您的意思是“将 Check 始终使用该字段的最新版本”,那么是的,作为波动的副作用,情况就是如此 - 并交换整个引用比持续同步便宜得多(.NET 确保您不会有撕裂的引用,因此引用交换保证是原子的)。

注意:这种情况下的线程安全性严格依赖于哈希集在创建和引用交换后不发生变化的事实,这就是代码中发生的情况在问题中。

不过,通过将字段声明为 volatile,您可以更方便地获得相同的结果:

public class Checker
{
private volatile HashSet<int> _hs = new HashSet<int>();

public bool Check(int a) => _hs.Contains(a);

public void Update(IEnumerable<int> items) => _hs = new HashSet<int>(items);
}

关于C#:HashSet的volatile读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54690274/

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