私はこのDataTableを持っています:
DataTable dt = GetDatatTable();
その列の1つはAmount
(10進数)です
を使用してできるだけ早く要約したいと思い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) 2番目のスレッド:total = total +
___stop__
(コンテキストスイッチ、スレッド3には値3が含まれます)___val=_3____
(total = 1 + 3 = 4)3)コンテキストスイッチをスレッド2に戻しますtotal = 4 + 2=6。
だからすべてがうまくいくようです。
私はここで何かが欠けているに違いありません。
PS 私は私がそれを行うことができることを知っています:
ParallelEnumerable.Range (1, dt.Rows.Count+1).Sum (i => Decimal.Parse(dt.Rows[i-1]["Amount"]) )
しかし、私はそれを行うことを学びたいですParallel.For