问题标签 [concurrentdictionary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# 并发字典添加或更新
我对 AddOrUpdate 方法感到困惑。文档特别说 updateValueFactory 是不同步的。
在 MSDN 中给出了这个例子:
如果有多个线程尝试增加旧值,它们中的一些是否可能会更新陈旧的值?
谢谢。
.net - .Net 中是否有类似 ConcurrentSet 的东西?
我使用了ConcurrentDictionary
in .Net 并爱上了使用它编写并发类是多么容易。
现在,我有一个不同的场景。我基本上需要跟踪非重复无序列表中的单个对象类型,所以基本上是一个Set<T>
类型的东西,除了它需要我所期望的所有线程安全性ConcurrentDictionary
,所以有类似GetOrAdd
.
.Net中是否有类似的东西?
我考虑过只使用 ConcurrentDictionary 并且只担心密钥,而从不使用值,但这似乎非常不理想
c++-cli - c++ cli ConcurrentDictionary 警告 4538
当我有这个 c++ cli 代码时:
我在第一个 { 上收到警告 C4538。有没有人知道为什么会发生这种情况以及它警告什么,或者这也是一个编译器错误,因为它是针对这个问题中的情况:使用 C++/CLI 的看似不恰当的编译警告
尽管我看到它们有些相关,但我没有Group
对象而是ConcurrentDictionary
. 我正在使用针对 .NET 4.0 框架的 Visual Studio 2010 并使用 /clr 编译器标志进行编译。
确切的错误信息是:
c# - ConcurrentDictionary<> 对单线程性能的误解?
相关简要信息:
AFAIK,并发堆栈、队列和包类在内部使用链表实现。
而且我知道争用要少得多,因为每个线程都负责自己的链表。无论如何,我的问题是关于ConcurrentDictionary<,>
但我正在测试这段代码:(单线程)
结果:(多次测试,相同的值(+/-))。
问题 :
在单线程环境中是什么让ConcurrentDictionary<,>
速度慢得多?
我的第一直觉是,这lock(){}
总是会更慢。但显然不是。
c# - ConcurrentDictionary 是 SortedList 的“并发”版本吗?
我想了解ConcurrentDictionary
vers的计算复杂性SortedList
(即O(logarithmic(n))
),ConcurrentDictionary 是否只是 a 的并发同步实现SortedList
?还是这些数据结构有所不同?彼此之间?
c# - 为什么 ConcurrentDictionary.AddOrUpdate 方法很慢?
我正在研究线程安全的多值字典。在内部,此字典使用带有自定义链接列表作为值的并发字典 (.net 4.0)。在链接列表中添加了相同的关键项。问题是当我使用并发字典的 AddOrUpdate 方法(方法 1)插入项目时,与使用 TryGetValue 方法检查键是否存在然后添加或更新值相比,代码运行速度有点慢手动锁内(方法 2)。使用第一种方法插入 300 万条记录大约需要 20 秒,而使用第二种方法在同一台机器上大约需要 9.5 秒(Intel i3 第二代 2.2 ghz 和 4 Gb ram)。一定有一些我无法弄清楚的东西丢失了。
我还检查了并发字典的代码,但它似乎和我在锁内做的一样:
这是线程安全多值字典的代码(方法 2 已注释,取消注释以检查差异)。
更新:下面还有我没有粘贴的删除、添加和其他方法。
测试代码仅插入项目,所有项目都具有唯一键。如下。
更新1:
根据“280Z28”的回答,我重新表述了这个问题。为什么 GetOrAdd 和“我的”方法花费几乎相同的时间,而在我的方法中,我需要一个额外的锁并且还调用 TryAndGet 方法。以及与 AddOrGet 相比,为什么 AddOrUpdate 需要双倍的时间。所有方法的代码如下:
ConcurrentDictionary (.net 4) 中的 GetOrAdd 和 AddOrUpdate 方法具有以下代码:
GetOrAdd 在我的代码中使用如下(需要 9 秒):
AddOrUpdate 的使用如下(所有添加需要 20 秒,没有更新)。如答案之一所述,这种方法不适合更新。
没有 AddOrGet 和 AddOrUpdate 的代码如下(耗时 9.5 秒):
.net - 并发字典 TryGetValue 与 []。[] 仍然是线程安全的吗?
我有以下内容ConcurrentDictionary
:
我知道这sessions.TryGetValue(key, out session)
是线程安全的,但我的问题是是否sessions[key]
也是线程安全的?
sessions.TryGetValue(key, out session)
根据是否能够获取值返回 true 或 false。
如果无法获取值会sessions[key]
返回吗?null
我会这么认为。任何人都可以确认或阐明这一点吗?谢谢。
.net - atomic addorupdate(尝试使用并发字典编写命名储物柜)
ConcurrentDictionary Pitfall - GetOrAdd 和 AddOrUpdate 的委托工厂是否同步?注意 AddOrUpdate 不是原子的(并且不能保证委托不会运行超过一次)。
我正在尝试使用并发字典 a la here来实现名称锁定实现,但是字典不应该永远增长,如下所示:
但问题是 AddOrUpdate 不是原子的,所以我看到当存在争用时条目通常不会被删除。我相当肯定,如果 AddOrUpdate 是原子的,那么上面的代码将完成它的工作,并且条目将被适当地删除。
注意这里提到的通过 key+val 扩展方法 TryRemove(key,val) 使用条件删除。此外,IntObject 是一个简单的 int 可变对象包装器。
我有哪些选择?是否有任何并发字典实现具有 1. 原子条件(键和值)删除和 2. AddOrUpdate 是原子的并确保委托不会多次运行?
还有其他想法吗?我希望命名的储物柜速度快,但在给定无限锁定命名空间但对给定名称没有太多争用的情况下没有内存压力问题。据我所知,按名称进行的字符串实习锁定会永远增长,并且永远不会被清理并具有其他副作用。互斥锁是半慢的并且有各种烦恼(260 个字符限制)。
c# - 即使我确定它存在,ConcurrentDictionary 也找不到密钥
在我的静态类中,我有这个:
在线程 #1 我这样做:
在 Thread #1 之后几秒钟,在 Thread #2 中:
它输出“这不存在:abc”
然后在线程 #2 之后的线程 #3 中:
我得到输出“字符串:abc”和“是的,它存在”。
在 Thread #1 中,我使用 MD5 创建字符串,如下所示:
在线程#2 中,我从字节流中获取字符串,其中字符串是使用 UTF8 编码写入的,然后再次使用 UTF8 编码从字节中读取字符串。
在线程#3 中,我通过循环 ConcurrentDictionary 来获取字符串。
我在这里想念什么?据我所知,线程#2 的行为应该与线程#3 一样。
我有两种可能性,在我看来这两种可能性都很大:
- 这是我不知道的某种同步问题吗?
- 或者字符串以某种方式不同?当我将它输出到控制台时,它没有什么不同。
任何人有任何其他想法或解决方案?
编辑:
我像这样将数据写入流:
然后我像这样从流中读取数据:
concurrentdictionary - 如何确保在迭代 ConcurrentDictionary 对象时没有其他线程修改它?
这是我的场景: -我正在使用 ConcurrentDictionary -多个线程可以写入该字典 -现在,在每个周期间隔结束时,我需要读取整个字典并打印它们的值。在使用 foreach 和打印枚举该字典时,我不希望任何其他线程修改字典的内容。ConcurrentDictionary 显然在阅读时没有锁定。那么,当我阅读它时,确保没有其他线程修改这个并发字典的最佳方法是什么?我应该锁定 ConcurrentDictionary 对象吗?