図19●Visual Basicで作ったマルチスレッドの簡単な例。VS2008,VS2010のどちらでも同じように作れる
図19●Visual Basicで作ったマルチスレッドの簡単な例。VS2008,VS2010のどちらでも同じように作れる
[画像のクリックで拡大表示]
リスト7●メイン・フォームのコード。ボタンを押すとButtonExecute_Clickサブプロシジャが呼び出される(Form1.vb)
リスト7●メイン・フォームのコード。ボタンを押すとButtonExecute_Clickサブプロシジャが呼び出される(Form1.vb)
[画像のクリックで拡大表示]
リスト8●スレッドにするためのInteger1クラス(Integer1.vb)
リスト8●スレッドにするためのInteger1クラス(Integer1.vb)
[画像のクリックで拡大表示]

 複数のプロセサ,もしくはCPUコアを活用する方法としては,複数のプロセスを動かす「マルチプロセス」,一つのプロセスの中で複数のスレッドを動かす「マルチスレッド」などの方法が以前からある。

 Windowsは内部で複数のサービスが常時稼働して,全体としてはマルチプロセスのシステムになっている。ただ,ユーザーがコンピュータの性能不足を感じるのは「仕事Aをしろ」と命じてその結果が出てくるまでに待たされるときであり,その時間を短くするために,マルチプロセスのプログラミングをしようということはあまりない。一つの仕事を分割して複数のプロセスに割り当てても,プロセス生成やプロセス間通信のコストが大きく,トータルとして時間短縮の効果が得にくいからだ。

 スレッドはメモリーを共有しているので,スレッド間のデータのやり取りは高速だ。ただ,マルチスレッドのプログラミングは簡単とは言いがたい。図19,リスト7,リスト8は実行ボタンを押すと,20億回の足し算を一度はシングル・スレッドで,もう一度は8スレッドで実行し,1秒当たり何回足し算ができたかを表示するVisual Basicのプログラムだ。

 シングル・スレッド部分は単純で,(3)でゼロに初期化した変数aを用意し,(4)で開始時間を記録,(5)のループで加算を繰り返し,(6)で終了時間を記録して,(7)で表示するだけだ。

 マルチスレッド部分は,(8)のForループで8個のスレッドを起動する。(9)で各スレッドが終了したかどうかを確認する配列IsThreadFinishedの値をFalseにする。その配列は(1)の4行目で宣言している。(10)で処理を記述したオブジェクトを生成する。リスト8がそのクラス「Integer1」だ。(11)でオブジェクトに識別番号(ThreadId)を与え,(12)でスレッドが終了したときに(12)のFinishedEventHandlerサブプロシジャを呼び出すように設定する。(13)でオブジェクトのDoIntegerCalcメソッドをスレッドに割り当て,(14)でスレッドを実行する。

 各スレッドは,終了すると(15)を呼び出す。(16)でどのスレッドが終わったかをIsThreadFinishedに格納し,(17)でチェックしてすべてのスレッドが終了した場合だけ,(18)の結果出力を実行する。(18)ではTextBoxOutputという他スレッドが作ったコントロールを操作しているので,(2)でエラーが生じないようにしている。