【发布时间】:2017-01-05 11:01:28
【问题描述】:
如果我以这种方式使用Parallel.For,我想知道List<object> 是否是线程安全的。请看下面:
public static List<uint> AllPrimesParallelAggregated(uint from, uint to)
{
List<uint> result = new List<uint>();
Parallel.For((int)from, (int)to,
() => new List<uint>(), // Local state initializer
(i, pls, local) => // Loop body
{
if (IsPrime((uint)i))
{
local.Add((uint)i);
}
return local;
},
local => // Local to global state combiner
{
lock (result)
{
result.AddRange(local);
}
});
return result;
}
local 列表是线程安全的吗?我是否在result 列表中没有数据的正确数据由于多个线程而被改变,因为我使用的是正常循环?
注意:我不担心列表顺序。我想知道列表和数据的长度。
【问题讨论】:
-
List不是并行线程安全的,尤其是您想要的。 -
所以,这意味着我的
result列表中的数据与我从正常循环中获取的数据不同? -
这意味着.....
List不是线程安全的!! -
结果中的数字顺序不太可能总是与单线程运行时相同或相同。既然你
lock(result)和local是异步操作的结果,你的组合函数应该可以工作。 -
@Saadi 列表的长度应该与计算单线程时相同。也许单线程版本会更快,即使您为每个单个素数创建一个新列表。您宁愿让任务计算 prims 的范围,然后最终组合这些子范围。嗯...不知道我最后的陈述是否正确。取决于那个并行的东西是如何工作的。
标签: c# asp.net .net multithreading task-parallel-library