我有这个数据表:
DataTable dt = GetDatatTable();
它的一列是Amount
(十进制)
我想尽可能快地总结它TPL
。
object obj = new Object();
var total=0m;
Parallel.For (1, dt.Rows.Count+1 ,i => {lock (obj) total += Decimal.Parse(dt.Rows[i-1]["Amount"]) });
但我真的不想多次锁定。
问题 #1
有没有其他选择可以减少广泛的锁?
问题2
我不明白为什么我需要保护总蓄能器
保护是针对
+=
还是针对多线程更新total
?我的意思是看下面的流程,一个
Volatile
领域可以很容易地解决它。假设
total=0
DataTable 项目是1,2,3
1)第一个线程:total=total+1。(总计=1)
2)第二个线程:total = total+
___stop__
(上下文切换,线程3进来的值为3)___val=_3____
(total =1+3=4)3)上下文切换回线程 2 总计=4+2 = 6。
所以一切似乎都很好。
我一定在这里遗漏了一些东西。
PS 我知道我可以做到:
ParallelEnumerable.Range (1, dt.Rows.Count+1).Sum (i => Decimal.Parse(dt.Rows[i-1]["Amount"]) )
但我想学着做Parallel.For