並列処理を行うための基礎知識(Visual C++) − @IT(情報元のブックマーク数)

マルチスレッド処理を各基礎知識。

プロセスの場合と同様に、スレッドもCPUが複数あるときには真に並列に実行されます(図13-1の2)。CPUが1つしかない場合には、図13-1の3のように実行されます。プロセスの場合と比較すると、単一CPU上で複数のスレッドを実行することの意義はわかりにくいかもしれません。音楽プレーヤーにおいて、音楽の再生を止めることなくボリュームを変更することができるのは、これらが別のスレッドで行われているためです。メーラーにおいて、メールを受信している間にメールを書くことができるのも同様です。
複数のスレッドを利用することによって、たとえCPUが1つしかなくても処理速度が向上することがあります。図13-1の4のように、2つの処理AとBを実行しなければならない状況を考えます。どちらもある程度の時間のかかる処理ですが、処理Aにかかる時間の大部分は、ディスクアクセスによるものだとしましょう。CPUの情報処理速度に比べると、ディスクの読み書きの速度は非常に遅いので、これはよくある事態です。例として、図13-1の4のように2つの処理を単純に逐次的に実行すると、かかる時間はディスクIOの時間と処理Bにかかる時間の合計です。しかし、図13-1の5のように処理Aと処理Bを別々のスレッドにして、切り替えながら実行することにすれば、ディスクIOを待っている間に処理Bを実行することができるので、全体の処理時間を短縮することができるのです(処理Bが処理Aの結果に依存しないようなものでなければなりません)。

並列処理を行うための基礎知識(Visual C++)(1/2) - @IT

マルチスレッドという概念は、C++C++/CLI自体には含まれていません。マルチスレッドはライブラリや特別なAPIを利用することによって実現します。Visual C++ Express Editionで簡単に導入できるマルチスレッドのためのライブラリやAPIには次のようなものがあります。

  • ネイティブスレッド

  Win32 APIによって提供される、最も低水準なスレッドです。Unix系OSMac OS Xを含む)ではpthreadが同等のスレッド機能を提供していますが、互換性はありません。

  • スレッドクラス

  Boostのthreadや.NETのSystem::Threading::Threadは、スレッドを利用するためのクラスです。Boostのthreadは前述のWin32のスレッドとpthreadの両者を抽象化しているので、これを利用すれば、コードはポータブルになります*3。

  • Intel Threading Building Block (TBB)

  スレッドセーフ(13.4.1項)なコンテナとアルゴリズムから成るテンプレートクラスライブラリです。スレッドを抽象化しているため、処理をスレッドに分割する方法等を考えなくても利用できます。

  マルチスレッドのためのAPIです。ここで挙げた中では最も高水準で、既存の逐次処理のコードを少し修正するだけで利用できます。

並列処理を行うための基礎知識(Visual C++)(1/2) - @IT

ここ一番重要w

並列化によるパフォーマンスの向上はたかだか定数倍ですが、アルゴリズムの改良によるパフォーマンスの向上は、それよりもはるかに大きくなることがよくあります。ですから、高速化のために闇雲にプログラムを並列化するのではなく、アルゴリズムについてゆっくり考えることを習慣にするべきでしょう。

並列処理を行うための基礎知識(Visual C++)(2/2) - @IT

screenshot