Mon*_*RPG 6 c# multithreading concurrentdictionary
简单的问题假设我有一个 ConcurrentDictionary
我使用TryAdd和ContainsKey方法
现在假设从100个线程我开始处理东西.假设3个线程在添加新密钥时使用TryAdd方法另外3个线程询问密钥是否存在与ContainsKey方法有关
不要ContainsKey等到那些3个线程返回我结果之前加入的过程?
或者他们没有同步,我的意思是这3个线程中的一个可能正在添加我用ContainsKey方法询问的密钥但是由于该过程尚未完成,我将得到的答案将是假的
Ty非常感谢答案C#WPF .net 4.5最新
"不"(参见Sam的评论),此外,没有通过ContainsKey对ConcurrentDictionary的其他访问或方法调用建立的原子防护.
也就是说,以下代码被破坏了
// There is no guarantee the ContainsKey will run before/after
// different methods (eg. TryAdd) or that the ContainsKey and another
// method invoked later (eg. Add) will be executed as an atomic unit.
if (!cd.ContainsKey("x")) {
cd.Add("x", y);
}
Run Code Online (Sandbox Code Playgroud)
并且Try*应该始终如一地使用这些方法
cd.TryAdd("x", y);
Run Code Online (Sandbox Code Playgroud)
如果需要通过专用并发方法保证进一步的同步(或原子性),则应建立更大的监视/锁定上下文.