お世話になっております。
非同期処理でList<Dictionary<ParamType,double>>
にParamTypeごとの計算処理を行いたいと思っています。
C#
1 var adjust_params = Enumerable.Range(0, node_depth).Select(index => 2 new Dictionary<SamplingKey, double>() { 3 {ParamType.a,0}, 4 {ParamType.b,0}, 5 {ParamType.c,0}, 6 7 ).ToArray(); 8 9 Parallel.ForEach(nodes.Values, node => 10 { 11 int gen_counts = node.tables.AsParallel().Sum(data => data.generate) 12 13 var ab_task = Task.Run(() => 14 { 15 double y1 = 0; 16 double y2 = 0; 17 for (int i = 1; i < gen_counts; i++) 18 { 19 double y = generateOrNot(); 20 y1 += 1 - y; 21 y2 += y; 22 } 23 return new { a = y1, b = y2 }; 24 }); 25 26 double c = Math.Log(node.price); 27 28 lock(adjust_params[node.depth]){ 29 adjust_params[node.depth][ParamType.a] += ab_task.Result.a; 30 adjust_params[node.depth][ParamType.b] += ab_task.Result.b; 31 adjust_params[node.depth][ParamType.b] += c; 32 } 33 });
この処理ではnodeの数が多すぎるとlock(adjust_params[node.depth])でデッドロックになります。恐らく、二つ以上のスレッドが運悪くクリティカルセクションに侵入してしまうとadjust_paramの読み込みがロックされてデッドロック状態になってしまうようです。nodeがそこまで多くなければ問題なかったのですが、CPU使用率が100%になったりするので、遅延発生で同時にクリティカルセクションに侵入してしまうnodeがあるのかと思っています。やってることは重たい処理を並列化して、nodeごとの合計を出したいだけなのですが、どのように改善するのがよいでしょうか。
アドバイスいただける方いましたらよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/26 06:10 編集
2017/01/26 06:03
退会済みユーザー
2017/01/26 06:41 編集