【发布时间】:2008-12-08 11:07:15
【问题描述】:
在多 CPU 机器上运行的多线程程序中,我是否需要使用易失性读/写访问共享状态(下面示例代码中的 _data)以确保正确性。
也就是说堆对象可以缓存在cpu上吗?
使用下面的示例并假设多线程将访问 GetValue 和 Add 方法,我需要 ThreadA 能够添加数据(使用 Add 方法)和 ThreadB 能够立即查看/获取添加的数据(使用GetValue 方法)。那么我是否需要向 _data 添加易失性读/写来确保这一点?基本上我不想在 ThreadA 的 cpu 上添加要缓存的数据。
/我没有锁定(强制执行独占线程访问),因为代码需要超快,并且我没有从 _data 中删除任何数据,所以我不需要锁定 _data。
谢谢。
**** 更新 ****************************
显然,你们认为使用这个例子来实现无锁是个坏主意。但是我在这里会面临哪些副作用或例外情况?
如果 1 个线程正在迭代读取值而另一个线程正在迭代更新值,那么 Dictionary 类型会抛出异常吗?还是我只会遇到“脏读”(在我的情况下这很好)?
**** 结束更新 ****************************
public sealed class Data
{
private volatile readonly Dictionary<string, double> _data = new Dictionary<string, double>();
public double GetVaule(string key)
{
double value;
if (!_data.TryGetValue(key, out value))
{
throw new ArgumentException(string.Format("Key {0} does not exist.", key));
}
return value;
}
public void Add(string key, double value)
{
_data.Add(key, value);
}
public void Clear()
{
_data.Clear();
}
}
感谢您的回复。关于锁,这些方法几乎经常被多个线程调用,所以我的问题是有争议的锁而不是实际的锁操作。
所以我的问题是关于 cpu 缓存,堆对象(_data 实例字段)可以缓存在 cpu 上吗?我是否需要使用易失性读/写访问 _data 字段?
/另外,我被 .Net 2.0 困住了。
感谢您的帮助。
【问题讨论】:
标签: c# multithreading