【发布时间】:2012-01-03 18:37:40
【问题描述】:
我认为这是对并发字典的正确使用是否正确
private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>();
//Main thread at program startup
for(int i = 0; i < 4; i++)
{
myDic.Add(i, 0);
}
//Separate threads use this to update a value
myDic[InputID] = newLongValue;
我没有锁等,我只是在更新字典中的值,即使多个线程可能正在尝试做同样的事情。
【问题讨论】:
-
这取决于 -
newLongValue是否取决于myDic[InputID]的先前值? -
您应该避免直接通过密钥访问
myDic[InputID]以获取竞态条件。你应该试试GetOrAdd -
@OlivierAlbertini,我认为
myDic[InputID]在用作左值时不会引起任何问题。GetOrAdd不是正确的替换,因为它仅在值不存在时才添加。我们可以改为使用AddOrUpdate在字典中添加/更新相同的值。 -
@JatinSanghvi 这里的旧响应,但我想说是的,直接使用访问器会导致问题,因为它绕过了原子操作。根据文档:“无条件地将键/值对存储在字典中,并覆盖已存在的键的值”。关键词是无条件的,如果你在更新时避免并发/原子功能,那么使用并发字典是没有意义的。
标签: c# .net multithreading .net-4.0 concurrency