マルチスレッドにする理由

Windowsにおいてマルチスレッドにする理由は何でしょうか?

並列処理による高速化をすれば~等と言う人も多いですが、私の経験則からして大抵の人は良く理解せずに発言しているようです。Windows開発における超基礎をおさらいします。


最初にマルチスレッド化した際の欠点を挙げてみます。

  • プログラム作成の難易度が非常に高くなる
  • 別のスレッドには別のCPUが割り当てられる事も有り、CPUのキャッシュが効かなくなる
  • Visual C++等では排他処理を含めたC言語ランタイムを利用しなくてはならないため、動作が遅くなる

私がマルチスレッドにするのは止めたら?という一番の理由は難易度です。10年以上経験を積んだプログラマでも難しい事が、そこらの職場にいる人に出来る訳がありません。

2番目の例は何も分かっていない技術者を黙らせる為にいってみるだけで、むしろダマシの領域です。WindowsやLinuxではアフィニティという考え方があり、これは意図的に避けることだって出来ます。

そして当然ながら、C言語はシングルスレッド時代の産物なので、大域変数が多量にあり、その変数全てに対して排他処理が必要な分が遅くなります。つまり、C言語の関数の大多数が遅くなるのです。Windowsのカーネルも同様の理由で、(HyperTheadingを含む)2CPU以上の場合、排他処理を含むカーネルがインストールされ、遅くなります。

つまり、マルチスレッドにする正当な理由がないと遅くなるのです。

それでも採用するのは、以下の条件にあてはまる事が多いようです。

  • 処理が可分であり、その処理の1つ1つに数ms以上の待ちが存在する
  • ユーザがGUIと対話して作業しており、その処理の中断が必要な場合

1番目の最たる例はWebサーバでしょう。サーバはクライアントの応答を待つ必要があり、その間サーバが待っているのでは話になりません。高価な演算をしつづける計算機サーバもこれに当てはまります。

2番目の例は「エクスプローラ」の検索における割り込みでしょう。検索側のスレッドを強制的に止めたい時には、それより高い優先度で作成された別スレッドによる割り込みをかける必要があります。タスクマネージャも同様の理由で「高優先度」になっています。

馬鹿らしい例外事項として「顧客が(無意味に)CPU数の多いサーバを抱えており、それを無理矢理活用しなくてはならない場合」です。Windowsではスレッドが1つだとCPUは1つしか動きませんから、スレッドをCPU数分以上立ち上げないといけません。

次にどうしてもマルチスレッドプログラミングを押しつけられそうになったときに、以下の案を検討してみましょう。

  • .NET(COM+)のアパートメントを利用する
  • 複数プロセスで代用出来ないかを検討する

1番目の考え方は1つ1つのコンポーネントはシングルスレッドとして実装して、それをマルチスレッドのコンポーネントに調停させるという考え方です。コンポーネント単位でマルチスレッド対応していく事が出来る為、マルチスレッドにする部分が最小限で済みます。Windowsでは非常にお勧めです。

2番目の考え方は、平行数が非常に少なく、1つ1つの処理に長い時間がかかる場合、もう1つのプロセスを立ち上げれば良いわけです。

以上が基礎的な考え方でした。質問、ツッコミ等ありましたらよろしくお願いします。

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz