使用并行库添加到列表时保证线程安全的正确方法
我循环访问连接字符串数组,并在每个循环中提取一些信息并将其添加到列表中。现在,我想使用并行库使其成为多线程,但我不确定该库是否保证对列表的写入是线程安全的,或者我是否需要使用锁定:
List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting =>
{
list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
I loop over an array of connection strings and on each loop I extract some information and add to the list. Now, I want to use Parallel library to make it multithreaded, but I'm not sure if the library guarantees that writes to the list would be thread-safe or whether I need to use locking:
List<SomeType> list = new List<SomeType>();
settings.AsParallel().ForAll(setting =>
{
list.AddRange(GetSomeArrayofSomeType(setting)); /// DO I NEED TO DO LOCKING HERE???
})
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于多线程写入来说,写入列表确实不安全。您需要使用
锁
来同步访问,或者使用像ConcurrentQueue
这样专为多线程访问而设计的集合。锁定示例(假设
list
是方法的本地方法)或者更好的是使用
SelectMany
而不是ForEach
Write's to the list are indeed not safe for multithreaded writes. You need to either use a
lock
to synchronize access or use a collection likeConcurrentQueue
which is designed for multithreaded access.Lock example (assuming
list
is a local of a method)Or better yet use
SelectMany
instead ofForEach