1

我有一个使用ConcurrentDictionary.

在这个类中,有三个函数对 this 执行一些操作ConcurrentDictionnary

每个函数由不同的线程调用。

  • 第一个函数操作:dictionnary.Where、dictionnary.TryRemove
  • 第二个函数操作:dictionnary.Where
  • 第三个函数操作:dictionnary.TryAdd

while (!dictionnaryKey.TryAdd(key, item))
{
  LogWriter.error_log("try add to dictionnary ...");
}

最后一个功能在不同的时间阻塞。我必须在不阻塞的情况下将我的元素添加到字典中,但我该怎么做?

4

1 回答 1

1
I have to add my element to the dictionary without blocking, but how can I do?

这是不可能的。ConcurrentDictionary 针对多线程和低争用进行了优化,但这并不意味着没有争用(阻塞)。ConcurrentDictionary 中的所有写操作都使用细粒度锁定模型,内部使用多个锁对象来同步写操作,以保持数据一致并防止多线程异常。

您的TryAdd方法显然被阻塞了,因为它正在等待一个锁(由不同的线程获取)被释放。

并发字典枚举(例如您的Where操作)没有阻塞的原因是因为它们使用无模型。

使用普通的旧字典而不是 ConcurrentDictionary 不会产生任何性能优势,因为您必须自己使用读写锁来处理锁​​定。

正如@Usr 在您的评论中所说,如果您的目标是进行非阻塞处理,而不是在多作者场景中使用单个 ConcurrentDictionary 的整个概念可能是错误的。

于 2014-10-17T09:56:42.217 回答