我正在使用Parallel.ForEach
来完成大量工作。
我想知道这个过程是怎么回事。
所以目前我写道:
int processCnt=0;
Parallel.ForEach(allJobs, myPallOption, (oneJob) =>
{
processCnt++;
Console.WriteLine("Job#"+processCnt+"/"+totalCnt);
doJob(oneJob);
}
但我认为processCnt++;
会以某种方式锁定,这可能不是一个好主意。
这可能会减慢这个过程。
那么有没有更好的方法来了解已经完成了多少工作?
我并不关心processCnt
的准确性,
我只想要更高的速度。我认为processCnt++
的效果可能较慢。
答案 0 :(得分:0)
怎么样:
int processCnt=0;
Parallel.ForEach(allJobs, myPallOption, (oneJob) =>
{
var currentCount = Interlocked.Increment(ref processCnt);
Console.WriteLine("Job#"+currentCount+"/"+totalCnt);
doJob(oneJob);
}
通过使用局部变量'currentCount',您可以确保在本地增量和将其写入控制台之间不会更改'processCnt'。
答案 1 :(得分:0)
将processCnt++;
替换为Interlocked.Increment(ref processCnt);
由于使用[ref],您无需将结果分配给另一个变量。
答案 2 :(得分:0)
要专门解答您的问题:++运算符不是设计为线程安全的,因此不会产生额外费用。但它会产生错误的结果。 Interlocked.Increment(如其他答案所示)更好,它是正确的,如果它仍然不是很昂贵。方式比实际锁更便宜。
Interlocked.Increment很便宜,因为它可以使用特殊的CPU指令实现,该指令在该指令的时间内冻结所有其他内核。