2013年2月6日水曜日

Parallelのコードを書くときの注意点

マルチコアを活かそうとして、Parallelのコードを書くかと思いますが、自処理の外の変数を使用するときは、lockステートメントを使用して排他制御をしましょう。
下記のようなコードは、aの値が、必ずしも0とはならない。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int a = 0;
List<string> l = new List<string>();

for (int i = 0; i < 10000; i++)
{
l.Add("" + i);
}

Parallel.ForEach(l, s =>
{
a = a + int.Parse(s);
Console.WriteLine(s);

a = a - int.Parse(s);

});

Console.WriteLine("a=" + a);
Console.ReadLine();
}
}
}


a = a + int.Parse(s);
lock(l) a = a + int.Parse(s);
となります。

0 件のコメント:

コメントを投稿