並列処理

Parallelクラスの使い方についてメモ。
完全に自分用メモなのでコメントは省略。

public struct Data
{
    public int me;
    public int cl;
}

private static int flag = 0;
private static object syncObject = new object();
private static Data[] data1 = new Data[10];
private static Data[] data2 = new Data[50];

private static void paraExecute()
{
    Func<Data[], bool> func = (d) =>
        {
            // 並列処理1
            Parallel.For(0, d.Length, i => { paraCalc(ref d[i]);} );
            return true;
        };
    try
    {
        // 並列処理2
        Parallel.Invoke(
            () => func(data1),
            () => func(data2));
    }
    finally
    {
        lock (syncObject)
        {
            if (flag < 2) flag++;
            else          flag = 0;
        }
    }
}

private static void paraCalc(ref Data d)
{
    // クリティカルセクション
    lock (syncObject)
    {
        if (flag == 1)
        {
            d.me = d.cl;
            d.cl = 1;
        }
        else
        {
            d.me = d.cl;
            d.cl = 2;
        }
    }
}

static void Main(string[] args)
{
    Parallel.Invoke(
        () => paraExecute(),
        () => paraExecute(),
        () => paraExecute());
}