问题标签 [concurrent-collections]

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.

0 投票
3 回答
4366 浏览

c# - 为什么 C# 中没有并发集合?

我正在尝试概述 C# 中的集合背后的线程安全理论。

为什么没有 Java 中的并发集合?(Java 文档)。有些集合看起来是线程安全的,但我不清楚该位置是什么,例如:

  • 复合操作,
  • 使用迭代器的安全性,
  • 写操作

我不想重新发明轮子!(我不是多线程专家,我绝对不会低估这将是多么困难)。

我希望社区可以提供帮助。

0 投票
3 回答
5703 浏览

c# - C# 中是否有 Java WeakHashMap 类的等价物?

是否有提供带有弱键或/和弱值的映射的 C# 类?或者至少类似于 WeakHashMap 的功能。

0 投票
2 回答
99 浏览

java - 查找从某个键到某个键的消息,同时能够删除过时的键

我的问题

假设我想将消息保存在某种数据结构中以用于长轮询应用程序:

从 index[4,5] 请求消息应该返回: "my","car"

接下来让我们假设一段时间后我想清除旧消息,因为它们不再有用并且我想节省内存。假设在时间x消息[1-3] 变得陈旧之后。我认为每秒钟删除一次是最有效的x。接下来我的数据结构应该包含:

我的解决方案?

我正在考虑使用concurrentskiplistsetorconcurrentskiplist地图。我也在考虑从newSingleThreadScheduledExecutor. 我想知道您将如何实现(有效/线程安全)这个或者使用库?

0 投票
3 回答
1144 浏览

c# - .Net 4.0 并行编程 - 如何将数据写入并发集合?

我有一个网格,定义为:List<List<Cell>>,其中“Cell”是我的自定义类。我的程序有几个线程可以访问网格上的各种坐标,并更改“Cell”类中的数据。但我只希望一个线程一次将数据写入“Cell”对象。我认为使用 ConcurrentBag 等并发集合会有所帮助,但似乎所有并发集合都只有添加项目或从集合中删除项目的方法。似乎没有一种线程安全的方式来更改此类集合中保存的数据。

我在这里遗漏了什么,还是没有“简单的方法”来使用这样的集合?

0 投票
7 回答
1131 浏览

c# - C# 中是否有良好的 IList 和 IDictionary 实现支持故障安全迭代?

根据标题 - C#/.NET 中是否有很好的内置选项可用于 IList 或 IDictionary 上的故障安全迭代?

我遇到问题的地方是类似于以下的代码:

在第一次 foo.Bar 为真后抛出以下内容:

我知道简单的解决方法是这样做foreach (Foo foo in new List<Foo>(someList)),但是必须记住每次都这样做很烦人。单身的。时间。这出现了。

来自 Java 背景,这可以用 CopyOnWriteArrayList/ConcurrentHashMap 巧妙地处理(我知道使用这些列表还有其他惩罚。)C# 中是否有我不知道的等价物?

0 投票
2 回答
465 浏览

iterator - 另一个 ConcurrentModificationException 问题

我搜索了 StackOverflow 并且有很多 ConcurrentModificationException 问题。读完之后,我还是一头雾水。我得到了很多这样的例外。我正在使用“注册表”设置来跟踪对象:

我通过像这样访问 ArrayLists 向这些列表中添加和删除对象:Registry.effects.add(obj)Registry.effects.remove(obj)

我设法通过使用重试循环来解决一些错误:

但在其他情况下,这是不切实际的。我的drawProjectiles()方法中不断收到 ConcurrentModificationExceptions,即使它没有修改任何内容。我想罪魁祸首是如果我触摸了屏幕,它会创建一个新的 Projectile 对象并将其添加到 Registry.proj 而 draw 方法仍在迭代。

我不能很好地用draw方法做一个重试循环,否则它会重新绘制一些对象。所以现在我不得不找到一个新的解决方案。有没有更稳定的方法来完成我正在做的事情?

哦,我的问题的第 2 部分:很多人建议使用 ListIterators(正如我一直在使用的那样),但我不明白.. 如果我调用ListIterator.remove()它是否从它正在迭代的 ArrayList 中删除该对象,或者只是将其从迭代器本身?

0 投票
3 回答
68945 浏览

c# - 如何使用 ConcurrentQueue 处理线程

我试图弄清楚使用队列的最佳方式是什么。我有一个返回 DataTable 的进程。每个 DataTable 依次与前一个 DataTable 合并。有一个问题,在最终 BulkCopy (OutOfMemory) 之前保存的记录太多。

所以,我决定我应该立即处理每个传入的 DataTable。考虑ConcurrentQueue<T>...但我不知道该WriteQueuedData()方法如何知道将表出列并将其写入数据库。

例如:

我的第一个问题是,除了我实际上没有要订阅的任何事件之外,如果我ExtractData()异步调用这将是我所需要的全部吗?其次,我是否遗漏了一些关于ConcurrentQueue<T>函数的方式以及需要某种形式的触发器来与排队的对象异步工作?

更新 我刚刚派生了一个ConcurrentQueue<T>具有 OnItemQueued 事件处理程序的类。然后:

对此实施有任何担忧吗?

0 投票
1 回答
14525 浏览

c# - 在 .NET 4.0 的 ConcurrentDictionary 中使用 AddOrUpdate 方法

我在并发集合和线程方面遇到了麻烦,特别是在 ConcurrentDictionary 中使用 AddOrUpdate 方法基本上.....我无法使用它..我找不到任何好的例子......而且也不能不完全明白,MSDN编程指南中ConcurrentQueue的例子..


ConcurrentDictionary 中的 AddOrUpdate 方法基本上......我无法使用它..我找不到任何好的例子......而且也无法完全理解,MSDN 编程指南中的 ConcurrentQueue 示例..

0 投票
1 回答
28838 浏览

c# - SynchronizedCollection 和有什么区别和其他并发集合?

除了 Concurrent Collections 是命名空间和类之外,命名空间中SynchronizedCollection<T>的并发集合有何不同?System.Collections.ConcurrentSynchronizedCollection<T>

SynchronizedCollection<T>Concurrent Collections 中的所有类都提供线程安全的集合。我如何决定何时使用其中一种,为什么?

0 投票
11 回答
26704 浏览

c# - 为什么是 ConcurrentBag.Net(4.0)这么慢?我做错了吗?

在开始一个项目之前,我写了一个简单的测试来比较 (System.Collections.Concurrent) 中的 ConcurrentBag 相对于锁定 & 列表的性能。我非常惊讶 ConcurrentBag 比使用简单列表锁定要慢 10 倍以上。据我了解,当读者和作者是同一个线程时,ConcurrentBag 效果最好。但是,我没想到它的性能会比传统锁差那么多。

我已经使用两个 Parallel for 循环写入和读取列表/包进行了测试。但是,写入本身显示出巨大的差异:

在我的机器上,这需要 3-4 秒才能运行,而这段代码需要 0.5 - 0.9 秒:

正如我所提到的,进行并发读写对并发包测试没有帮助。我做错了什么还是这个数据结构真的很慢?

[编辑] - 我删除了任务,因为我在这里不需要它们(完整代码有另一个任务阅读)

[编辑] 非常感谢您的回答。我很难选择“正确答案”,因为它似乎是几个答案的混合体。

正如 Michael Goldshteyn 所指出的,速度真的取决于数据。Darin 指出 ConcurrentBag 应该有更多的争用更快,而 Parallel.For 不一定启动相同数量的线程。要带走的一点是不要做任何你不必锁内做的事情。在上述情况下,我看不到自己在锁内做任何事情,除了可能将值分配给临时变量。

此外,sixlettervariables 指出,恰好正在运行的线程数也可能会影响结果,尽管我尝试以相反的顺序运行原始测试并且 ConcurrentBag 仍然较慢。

我从 15 个任务开始进行了一些测试,结果取决于集合大小等。但是,对于多达 100 万次插入,ConcurrentBag 的性能几乎与锁定列表一样好或更好。超过 100 万,有时锁定似乎要快得多,但我的项目可能永远不会有更大的数据结构。这是我运行的代码: