我有一个使用ConcurrentDictionary
的课程。
在本课程中,有三个函数对此ConcurrentDictionnary
执行某些操作。
每个函数都由不同的线程调用。
while (!dictionnaryKey.TryAdd(key, item))
{
LogWriter.error_log("try add to dictionnary ...");
}
最后一个功能在不同时间阻止。我必须将我的元素添加到字典而不会阻塞,但我该怎么办?
答案 0 :(得分:1)
I have to add my element to the dictionary without blocking, but how can I do?
这是不可能的。 ConcurrentDictionary针对多线程和低争用进行了优化,但这并不意味着没有争用(阻塞)。 ConcurrentDictionary中的所有写入操作都使用细粒度锁定模型,并且内部使用多个锁定对象来同步写入操作以保持数据一致并防止多线程异常。
您的TryAdd
方法显然已被阻止,因为它正在等待锁定(由其他线程获取)才能被释放。
并发字典枚举(例如您的Where
操作)未阻止的原因是它们使用无锁模型。
使用普通旧字典而不是ConcurrentDictionary不会产生任何性能优势,因为您必须使用读写锁自己处理锁定。
正如@Usr在您的评论中所说,如果您的目标是进行非阻塞处理,而不是在多作者场景中使用单个ConcurrentDictionary的整个概念可能是错误的。