リスト9●パラレルFor(ParallelクラスのForメソッド)を使ってみた(Form1.vb)
リスト9●パラレルFor(ParallelクラスのForメソッド)を使ってみた(Form1.vb)
[画像のクリックで拡大表示]
図20●リスト9のプログラムを起動し,Button1とButton2を順番に押したときのデバッグ出力。1行目は通常のForで順番通りだが,2行目はパラレルForでバラバラである
図20●リスト9のプログラムを起動し,Button1とButton2を順番に押したときのデバッグ出力。1行目は通常のForで順番通りだが,2行目はパラレルForでバラバラである
[画像のクリックで拡大表示]

 現在のパソコンでは,一つのCPUに2個のコアを備えた「デュアルコア」,4個のコアを備えた「クアッドコア」が採用されている例が珍しくない。複数のコアを活用するにはマルチスレッドのプログラミングをするのが基本だが,Visual Studio 2010では,スレッドを直接使わずに処理を並列化する機能がたくさん搭載されている。

 リスト9は,Visual Basicで .NETFramework 4.0に含まれるParallel.For(ParallelクラスのForメソッド)を使った例だ。フォームにボタンを二つ貼り付けて(名前はButton1とButton2),リスト9のようにコードを編集する。Button1を押すと呼び出される(2)は通常のFor Each文を使っている。(3)で変数totalを用意し,(4)のFor Eachループで,(1)で宣言して1~100の値を入れた配列numsの各要素を足し合わせ,(5)で「5050」という結果を表示する。

 Button2を押すと呼び出される(6)では,(7)でPrallel.Forを使っている。Forメソッドのパラメータが多いのでややこしい。最初のゼロはループの始まり,次のnums.Lengthが終わり,3番目の「Function() 0」はローカル・ステートを初期化するためのものだ。4番目のパラメータはループ内の処理を記述した関数,5番目はループが終わったときに呼び出される関数である。

 このコードではDebugクラスのWriteメソッドを使って処理の経過を出力ウィンドウに出している。(4)のループでは図20の1行目のように1~100までの数が順番に並ぶが,(7)のパラレル・ループではばらばらに表示され,並列実行される様子がうかがえる。