Chr*_*sen 8 c# concurrency multithreading
我的情况是这样的:
多个线程必须同时写入同一个集合(add和addrange).物品的顺序不是问题.当所有线程都完成(加入)并且我回到我的主线程上时,我需要以foreach样式快速读取所有收集的数据,因为所有线程都完成后不需要实际锁定.
在"过去的日子"中,我可能会在List上使用读写器锁,但是对于新的并发集合,我想知道是否有更好的选择.我只是无法弄清楚哪些并发集合似乎假设读者也在并发线程上.
我不相信你想使用任何收藏品System.Collections.Concurrent.这些通常具有额外的开销以允许并发读取.
除非你有很多争论,否则你可能更好地锁定一个简单的List<T>并添加它.当List调整大小时,您将有少量开销,但这种情况很少发生.
但是,在这种情况下我可能会做的只是添加到List<T> 每个线程而不是共享线程,并在处理结束时合并它们,或者简单地遍历每个集合中的所有元素.
您可以使用a ConcurrentBag然后在准备读取时调用.ToArray()或GetEnumerator()打开它(绕过每次读取惩罚),但您可能会发现插入的速度比手动写入锁定的速度慢一点List.这实际上取决于争用的数量.该ConcurrentBag是有关分区的不错,但正如你提到的,是面向并发读取和写入.
一如既往,以您的特定情况为基准!多线程性能在很大程度上取决于实际使用中的许多事情,诸如数据类型,插入次数等等将极大地改变结果 - 少数现实值得加倍理论.
物品的顺序不是问题.当所有线程都完成(加入)并且我回到我的主线程上时,我需要读取所有收集的数据
您根本没有声明对线程安全集合的要求.共享单个集合没有意义,因为您在写作的同时从未阅读过.所有写作都发生在同一个集合中并不重要,因为顺序无关紧要.也不重要因为订单无论如何都是随机的.
所以只需给每个线程自己的集合来填充,不需要锁定.然后逐个迭代它们,不需要锁定.
| 归档时间: |
|
| 查看次数: |
1420 次 |
| 最近记录: |