问题标签 [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 投票
1 回答
168 浏览

c# - 使用 System.Collections.Concurrent.BlockingCollection 阻止生产者直到收集达到其容量的一半

我有一个用 new BlockingCollectionof实现的“单一生产者/单一消费者”场景.NET 4.0

问题是一旦集合中有一个空间空闲,生产者线程就会唤醒。我希望生产者阻止,直到消费者消耗至少一半的集合项目。这是因为生产者的速度很高并且生产对系统来说是昂贵的。

如何控制生产者的阻塞条件?

0 投票
4 回答
770 浏览

c# - 如何在多线程场景中加速使用集合的例程

我有一个利用并行化处理数据的应用程序。

主程序在 C# 中,而用于分析数据的例程之一是在外部 C++ dll 上。每次在数据中找到某个信号时,该库都会扫描数据并调用回调。数据应该被收集、分类然后存储到 HD 中。

这是我对回调调用的方法以及排序和存储数据的方法的第一个简单实现:

数据由大小为 10000 xn 的二维数组(short[][] 数据)组成,其中 n 变量。我以这种方式使用并行化:

现在对于 10000 个数组中的每一个,我估计可以触发 0 到 4 个回调。我正面临瓶颈,并且鉴于我的 CPU 资源没有被过度使用,我认为锁(连同数千个回调)是问题所在(我是对的还是可能有其他问题?)。我已经尝试过 ConcurrentBag 集合,但性能仍然更差(与其他用户发现一致)。

我认为使用无锁代码的可能解决方案是拥有多个集合。然后有必要制定一种策略,使并行进程的每个线程都在单个集合上工作。例如,集合可以在以线程 ID 作为键的字典中,但我不知道任何 .NET 工具(我应该知道线程 ID 以在启动并行化之前初始化字典)。这个想法是否可行,如果是的话,是否存在一些用于此目的的 .NET 工具?或者,还有其他加快流程的想法吗?

[编辑] 我遵循了 Reed Copsey 的建议并使用了以下解决方案(根据 VS2010 的分析器,在锁定和添加到列表的负担之前占用了 15% 的资源,而现在只有 1%):

0 投票
1 回答
352 浏览

pthreads - 控制cnc/tbb中使用的线程数

我正在使用 intel cnc 库,它创建的线程数与内核数一样多。有没有办法控制用于该目的的线程数并可能控制它们的位置。

0 投票
5 回答
12094 浏览

c# - 并发字典与字典

正如MSDN 所说

ConcurrentDictionary<TKey, TValue>类 表示可由多个线程同时访问的键值对的线程安全集合。

但据我所知,System.Collections.Concurrent类是为 PLINQ 设计的。

我有Dictionary<Key,Value>它在服务器中保持在线客户端,并且当我可以访问它时通过锁定对象来使其线程安全。

在我的情况下,我可以安全地替换Dictionary<TKey,TValue>ConcurrentDictionary<TKey,TValue>吗?更换后性能会提高吗?

在第 5 部分中,Joseph Albahari 提到它是为并行编程而设计的

  • 并发集合针对并行编程进行了调整。除了高度并发的场景,传统的集合在所有场景中都优于它们。
  • 线程安全的集合并不能保证使用它的代码是线程安全的。
  • 如果您在另一个线程正在修改并发集合时枚举并发集合,则不会引发异常。相反,您会得到新旧内容的混合。
  • List 没有并发版本。
  • 并发堆栈、队列和包类在内部使用链表实现。这使得它们的内存效率低于非并发 Stack 和 Queue 类,但更适合并发访问,因为链表有利于无锁或低锁实现。(这是因为将节点插入到链表中只需要更新几个引用,而将元素插入到类似列表的结构中可能需要移动数千个现有元素。)
0 投票
1 回答
168 浏览

c# - 如果多次调用 GetOrAdd() ValueFactory,附加返回值会怎样?

在 C# 并发字典中,特别是签名 . . .

. . . 我知道 valueFactory 可能被多次调用。但是,多个返回值会发生什么?是否保证只有一个结果会映射到字典中,或者是否有可能存在一个窗口,其他线程可以在字典中看到不同的值?

0 投票
2 回答
3852 浏览

silverlight - Silverlight 4 中提供了哪些线程安全集合类?

我正在开发一个应用程序框架,客户端的 Silverlight 和服务器端的 .NET 4 将使用该框架。在内部,该框架具有字典和队列数据结构,其中多个线程将同时访问集合。

在服务器端,我想利用System.Collections.Concurrent命名空间中可用的ConcurrentDictionaryConcurrentQueue类。然而,这些类并未在 Silverlight 4 中实现。

我正在考虑的两种方法是:

  1. 反编译 ConcurrentDictionary 和 ConcurrentQueue 类并在 Silverlight 类库中实现它们。这些将使用System.Collections.Concurrent命名空间限定范围。
  2. 在服务器端和客户端都可以使用的共享库中实现我需要的自定义线程安全集合类(或找到可靠的 Silverlight 线程安全集合实现)。

第一种方法允许我只实现我需要的 Silverlight 数据结构,但我担心会在我的 Silverlight 实现和 .NET 4 中实现的并发集合类之间引入差异。

第二种方法将在客户端和服务器端提供一致的并发收集实现,但感觉就像我在重新发明轮子一样。

在 Silverlight中实现ConcurrentDictionaryConcurrentQueue类似乎不是很困难,但是 Silverlight 是否已经有一个很好采用的线程安全集合类库?

0 投票
1 回答
1288 浏览

c# - 在存在多个在队列上操作的线程的情况下访问 ConcurrentQueue 的最年轻元素

我们有一个 ConcurrentQueue 用于在 3 个线程之间共享数据。线程 A 不断地用数据填充队列。线程 B 旨在将这些数据记录到文件中。线程 C 应该检索队列中最年轻的条目(或尽可能接近最年轻的条目),对其执行一些操作并在屏幕上显示结果。

线程 B,为了及时对文件写入操作进行集群,执行如下操作:

即,它等待至少 100 个元素排队,然后将它们写入磁盘。它总是在队列中维护至少一项,原因是我们希望线程 C 始终可以访问至少一项。

线程 C 中的循环如下所示:

在这个循环中,由于将数据写入磁盘的线程与 cq.ElementAt(cq.Count-1) 调用之间的竞争,我们有时会遇到异常。我相信正在发生的事情如下:

  1. cq.Count 被计算为,比如 90。
  2. 到那时,线程 B 已经开始了它的循环,它正在从队列中取出数据以写入磁盘
  3. 在调用 cq.ElementAt() 时,线程 B 消耗了许多项目,使得 (cq.Count - 1) 不再指向队列中的有效条目。

关于在队列上运行多个线程的情况下访问队列中最年轻条目的好方法的任何想法?

问候,

0 投票
2 回答
656 浏览

java - 同步方法的弱值映射参考中的内存泄漏

我正在创建一个用于同时执行方法的接口,同时抽象出同步细节(在需要时交换分布式实现)。我创建了一个单一的 jvm 实现,它允许将字符串用作互斥锁,方法是将它们存储在映射中以确保使用一个引用,即使传入了不同引用的字符串。并发似乎工作正常,但是我是惊讶地发现测试显示引用计数从未减少。我认为使用 Wea​​kValues() 足以防止内存泄漏,但似乎并非如此。谁能指出可能导致这种泄漏的原因?

}

这是在最后一个断言中失败的测试:

}

最后一个断言破坏了测试:assertEquals(0, methodExecutor.mutexMap.size());

0 投票
2 回答
736 浏览

garbage-collection - 什么是“大部分并发垃圾收集器”?

我知道停止世界、增量、并行、并发、(软/硬)实时垃圾收集器的概念。但我无法理解主要是并发GC。与并发 GC 有什么不同吗?有什么不同?为什么它被称为主要

0 投票
3 回答
3639 浏览

java - 如何实现保持插入顺序的并发Set


我需要一个 Set 实现,它可以让我保持插入顺序并且仍然可以修改(如不抛出 ConcurrentModificationException)。

我尝试使用ConcurrentSkipListSet我自己的比较器 - 示例代码:

但看起来这个比较器是一个 #fail 因为集合打印:
[b, c, a, b, d] 。如果b在那里两次,它就没有设置。
我还有其他选择吗?