新的命名空间System.Collections.Concurrent包含了字典、队列和堆栈等类的并发集合。有人知道为什么没有ConcurrentList吗?
我发布了一个新问题来解释我当前的场景。我宁愿这样做也不愿改变原问题的整个含义。下面是新问题的the link。
odopli941#
如果两个线程同时添加项,您对“order”的期望是什么?如果您想要的只是项的集合,ConcurrentBag更合适。
flvlnr442#
随机访问在从另一个线程更改的数据结构上没有多大意义。如果你看一下并发集合,你会注意到它们的接口是专门为多线程访问而设计的,我想不出一个有用的类似列表的接口能很好地处理多线程代码。如果元素从未移动过,那么随机多线程访问是有意义的,但这时您有一个数组。
9vw9lbht3#
早在2011年,I wrote a ConcurrentList<T> class(代码可用on GitHub),它是线程安全的,无锁的,并实现了IList<T>接口的 * 一些 *。值得注意的是,不支持除Add之外的任何改变列表的操作;也就是说,它是一个只能追加的集合,所以Insert,RemoveAt等等都不起作用。
ConcurrentList<T>
IList<T>
Add
Insert
RemoveAt
3条答案
按热度按时间odopli941#
如果两个线程同时添加项,您对“order”的期望是什么?如果您想要的只是项的集合,ConcurrentBag更合适。
flvlnr442#
随机访问在从另一个线程更改的数据结构上没有多大意义。
如果你看一下并发集合,你会注意到它们的接口是专门为多线程访问而设计的,我想不出一个有用的类似列表的接口能很好地处理多线程代码。
如果元素从未移动过,那么随机多线程访问是有意义的,但这时您有一个数组。
9vw9lbht3#
早在2011年,I wrote a
ConcurrentList<T>
class(代码可用on GitHub),它是线程安全的,无锁的,并实现了IList<T>
接口的 * 一些 *。值得注意的是,不支持除
Add
之外的任何改变列表的操作;也就是说,它是一个只能追加的集合,所以Insert
,RemoveAt
等等都不起作用。