【发布时间】:2019-02-14 12:20:35
【问题描述】:
我有一堂课:
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 的使用模式正确吗?
【问题讨论】:
-
如果是同一个结构,一个元素可以被修改,而另一个线程读取它,那就有问题了。你需要在写作时让读者远离。信号量似乎是最佳解决方案,或者如果散列的类型允许原子行为,也应该适用于作者。它会锁定读者。
-
@LoveTätting 在所呈现的场景中,读者和作者无法竞争;作者创建一个 new 哈希集,然后在完成后交换引用;读者总是会得到一个不再被变异的哈希集,无论是“旧”还是“新”
-
啊,谢谢指出,我误会了
标签: c# .net multithreading volatile