gpt4 book ai didi

c# - 多个作者,一个读者,哪个集合

转载 作者:太空狗 更新时间:2023-10-29 19:59:58 24 4
gpt4 key购买 nike

我的情况是这样的:

多个线程必须同时写入同一个集合(add 和 addrange)。元素的顺序不是问题。当所有线程都完成(加入)并回到我的主线程时,我需要以 foreach 样式快速读取所有收集的数据,因为所有线程都已完成,因此不需要实际锁定。

在“过去”,我可能会在 List 上为此使用读写锁,但对于新的并发集合,我想知道是否有更好的选择。我只是不知道是哪个,因为大多数并发集合似乎都假定读者也在并发线程上。

最佳答案

我认为您不想使用 System.Collections.Concurrent 中的任何集合.这些通常有额外的开销以允许并发读取。

除非你有很多争用,否则你最好锁定一个简单的 List<T>并添加到它。当列表调整大小时,您将有少量开销,但这种情况很少发生。

但是,在这种情况下我可能会做的只是简单地添加到 List<T> 每个线程而不是共享线程,并在处理结束时合并它们,或者简单地迭代每个集合中的所有元素。

你可以使用 ConcurrentBag然后调用.ToArray()GetEnumerator()准备好读取时(绕过每次读取的惩罚),但您可能会发现插入速度比您在简单的 List 上的手动写入锁定慢一点。 .这实际上取决于争用的数量。 ConcurrentBag非常适合分区,但正如您所指出的,适用于并发读取写入。

一如既往,对您的特定情况进行基准测试!多线程性能高度依赖于实际使用中的许多因素,例如数据类型、插入次数等因素会显着改变结果 - 少数现实胜过大量理论。

关于c# - 多个作者,一个读者,哪个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14638834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com