電子書籍の厳選無料作品が豊富!

はじめまして。
質問があります。
現在マルチスレッドプログラミングについて学習しているのですが、
学習を進めていくうちにある疑問が思いつきました。それは、
マルチスレッドで実装した方がよい場合とシングルスレッドで実装
した方がよい場合の区別がよくわからないということです。マルチスレ
ッドで実装する利点は、例えば、応答性を向上させるとか、
入出力操作が関わっているときにCPUの空き時間を利用して別スレッド
で処理を行わせることによってスループットを向上させることぐらいしか思いつきません。また、CPUが1個しかない環境では、
CPUをフル活動するようなプログラムでは、下手にマルチスレッドで
実装するよりもシングルスレッドで実装したほうが排他制御しない
分だけ処理スピードは上であると思っているのですが、間違いでしょうか?マルチスレッドで実装した場合の利点は上述したこと以外にも
何かあるのでしょうか?ご教授お願いします。

A 回答 (1件)

その通りです。


人間とコンピュータ、CPUとハードディスク、ローカルとリモート、ディスク装置と印刷装置など、コンピュータシステムの中には全くスピードの異なるものが多く存在しています。遅い処理でブロッキングされないようにバックグラウンドで処理したいというのが基本的な発想です。
特定のマシン自体を専用で処理させる方が速いにきまっています。
ただし最近では、マルチCPU/マルチコアが当たり前となっていきますし、将来の並列マシン環境などを想定すると、複数のCPUで作業を分担して処理速度の向上を図ることも普通のこととなっていくでしょう。
マルチスレッド(並列処理)の弊害についてもその通りで特にリモートシステム間で共有するデータ(分散DBやスーパーアレイの共有テーブルなど)の排他がボトルネックとなってしまいます。設計により排他を免疫することは可能ですが、スレッドのスイッチなどのオーバーヘッドは消えません。
最後にマルチスレッドで実装した場合の利点ですが、マルチスレッドでのプログラミングは(多くの人の予測に反して)単純でわかりやすいことです。複数のデータ源から様々なタイミングで割り込みやイベントが発生するシステムのプログラミングは非常に複雑です。これらを専任のスレッドに処理させて、同一の受け口(キューなどの)から受信できるように構造化して設計すると、個々のロジックはシングルスレッド的にコーディングできるので、コーディングもデバッグもやりやすくなります。また、データ源が増えたり変更されたりした場合にも影響範囲が限定されます。ロジックの再利用もやりやすくなります。例えばWindowsソケットからBSDソケットにポーティングする場合、非同期I/O・同期I/Oの違いにより設計を根本的に変更する必要が発生しますが、バックグラウンドのスレッドに同期I/Oをさせる設計にしておけば、ポーティングしやすくなります。
私の場合、非同期I/OのAPIが別途用意されている環境でも、標準的な同期I/Oを用いて処理する専任のスレッドを割当てるように設計することが多いですね。
    • good
    • 0
この回答へのお礼

guccii様へ
ご回答ありがとうございました。
guccii様のご回答を読ませていただきまして、学習の余地が大分ありますが、基本的なマルチスレッドプログラミングを学習する上での方向性を見出せましたことに感謝します。ありがとうございました。

お礼日時:2007/01/04 01:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!