並列処理
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()); }