マルチスレッドプログラミングの利点とは?

このQ&Aのポイント
  • マルチスレッドプログラミングを学習中の質問者さんが、マルチスレッドとシングルスレッドの違いや利点について質問しています。
  • マルチスレッドで実装する利点として、応答性の向上や入出力操作におけるスループットの向上が挙げられます。
  • 一方、シングルスレッドで実装する利点は、CPUが1つしかない環境では排他制御が不要なため処理スピードが向上するとされています。
回答を見る
  • ベストアンサー

マルチスレッドプログラミングの利点について

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

  • Java
  • 回答数1
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • guccii
  • ベストアンサー率31% (14/44)
回答No.1

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

tyorotyoro123
質問者

お礼

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

関連するQ&A

  • マルチスレッドについて。

    今、大きな配列を元に処理を行うプログラムを作成しています。 シングルスレッドでも十分速度を向上するようチューニングに成功しましたが、マルチスレッド化をすればさらに速度を向上させることができるだろうと考え、先日マルチスレッドかに成功しました。 しかし・・・奇妙な現象が起こりました。 マルチスレッドで性能を引き出すには、排他制御はないほうが良いと考え、メモリは食いますがスレッドに与える入力情報(大きな配列)を2つ用意し、排他制御なしの2スレッドを実行できるようにしました。しかしやはりメモリを消費しすぎてしまうため、配列にアクセスする部分のみ排他制御を行うようクリティカルセクションを設定し入力情報を2スレッドで共有して処理を行うよう組み替えました。 結果、やはり排他制御なしの場合よりはるかにスピードダウンしてしまい、シングルスレッドより少し早い処理時間で終了してしまいました。 余りにも悔しいため、ちょっと危険な実験だとは思いましたが、入力情報を2つのスレッドで共有しているにもかかわらず、排他制御の部分、つまりクリティカルセクションを取り除いて実行してみようと考えました。予想としては同時にアクセスし衝突が起きてエラーで停止してしまうと考えましたが・・・・・・ 結果なぜかエラーなく処理をし続け、普通に終了してしまいました。 これはなぜでしょう? 偶然にも共有情報に同時にアクセスすることがなかったためでしょうか?

  • デュアルコアCPUはマルチスレッドに最適?

    デュアルコアCPUはマルチスレッドに有効と聞きますが、マルチスレッドとはどういうものでしょうか? (1)単純に、3Dゲームをし、ネットをし、同時にエンコードをし、同時に画像処理し・・・っていう作業の「マルチ」ですか? (2)それとも、単独アプリケーション自体にマルチスレッド対応(?)のものがあるのですか? よく、3Dゲームはシングルスレッドのため、デュアルコアCPUの優位性を引き出せないといいますが、上記(1)の場合に当てはまりますか?

  • マルチスレッドプログラミングについて

    現在DirectXでマルチスレッドを使ってプログラムを組んでいますが、その処理の中で描画のみを切り離してスレッド化しようと思っています。 そこで質問ですが、描画スレッドに渡す処理の個数が多い場合は描画スレッドを2つにして処理する個数も分けたほうが処理は早くなるのでしょうか?

  • 「UIスレッド」「マルチスレッド」の違い

    Androidで、「UIスレッド」「マルチスレッド」の違い、を教えてください。 ■下記理解で合ってるでしょうか? Androidは、「シングルスレッド」の「UIスレッド」モデルなので、それを「マルチスレッド」で動かそうとすると、「ワーカースレッド」で処理する必要がある ・「マルチスレッド」=「マルチタスク」? ・「UIスレッド」とは、メインスレッドが「GUI (グラフィカルユーザーインターフェイス) 処理」を行うものを指す? ・つまり、「Android」=「UIスレッド」? ・「UIスレッド」って何の用語? Androidに特化した用語? それともJAVAの用語? あるいはそれ以外?

    • ベストアンサー
    • Java
  • C++マルチスレッド処理について

    こんにちは 現在スレッドを作成して,マルチスレッド処理をしようとしているのですが, 全然理解できないので皆様のお力をお貸し下さい。 やりたい事は, (1) メインスレッドからスレッド1を作成。 (2) スレッド1では,ひたすらファイルなどからデータを取得させる。(読み込めなくなるまで) (3) メインスレッドでは,時々スレッド1を止めて,再度処理を続行させたい。 class Sample { public: // Sampleオブジェクト作成,同時にスレッド1を作成 Sample* create(); // スレッド1を止めて,再度動かす void process(); private: // この関数をスレッド1で処理させる // 内部では,読み込めなくなるまで無限ループ? void get(); }; スレッドに関してはイメージが湧くのですが, mutex (必要ですか?) に関しては一向に理解できません。 何を排他制御するのでしょうか。オブジェクト? 関数? 複雑ではなさそうなのですが,今までシングルスレッドの処理のみ書いていたため ピンときません。 よろしくお願い致します。

  • マルチスレッドについて

    現在”猫でもできる”の87、88章を学んでおります。 まず87章でマルチスレッドの根本的なやり方を学びましたが、いきなり疑問が浮かびました。 _beginthread関数によりスレッドをスタートさせ、この関数で登録した関数内で_endthread関数を実行し終了させていることは分かります。 しかし_beginthread関数で登録した関数に引数を渡す処理がどの部分で行われているのかわかりません。 登録する関数はvoid型で引数はvoid*型でなければいけないことは分かったのですが、プログラムのどこを見てもこの登録した関数に引数を渡す処理が行われていません。 その辺の動作の説明を分かる方でいいのでよろしくお願いします。 そして88章では排他制御のマルチスレッドを行うプログラムの製作を行っているのですが、ちょっとした疑問が浮かびました。 EnterCriticalSection関数、LeaveCriticalSection関数ではさまれたプログラムは排他制御され他からアクセスされない。 この関数はこんな理解で良いんですかね? この理解で行くと、88章で説明していきますが、子ウィンドウを2つ作成しそれぞれのプロシージャ内で排他制御された関数をスレッドとしてスタートしています。 この2つのスレッドの動作についてですが、互いに排他制御関数が記述されているため、動作としてはまず左の子ウィンドウのスレッドが処理されている場合、右の子ウィンドウのスレッドは停止している。そして左の子ウィンドウのスレッドの排他制御が解放されたときに、右の子ウィンドウのスレッドが開始する。 そしてあるとき左の子ウィンドウのクライアントウィンドウ内で右クリックされた場合、その時点で排他制御されたスレッドが終了するのを待ち、終了したらcountを+1する。 こんな動作が行なわれていると理解してよいのでしょうか?

  • 「スレッド」の概念について質問

    スレッドとは、「1つのプログラムにおいての1つの処理(メソッド)」のことで、これはシングルスレッドともよぶ。 マルチスレッドは、複数の処理を「同時に実行する」こと。但し、実際にはcpuは1つなので、擬似的に複数処理をしているようにみせかけている。 例えば、マルチスレッドは、ブラウザに例えれば、画像をダウンロードしながら、画面をスクロールしたりというように、複数の処理を同時に実行している。そして、この処理の1つ1つがスレッド。 こういうことでしょうか?

    • ベストアンサー
    • Java
  • CPUの性能はシングルスレッドとマルチ以外に指標は

    CPUの性能指標はシングルスレッドとマルチスレッド性能以外にありますか。

  • デュアルコアCPUのマルチスレッド処理について

    デュアルコアCPUにおけるマルチスレッドの処理について質問です。 ハイパースレッドをオフにしデュアルコアの CPU を 4 つ乗せた。 本来であれば、 8 CPU で処理が行なわれるはずであり、別途プロセスが立ち上がっての処理の場合は問題なく処理が行なわれているのだが、マルチスレッドにて処理を行なった場合、各 CPU の片側のみで処理が行なわれてしまう。(タスクマネージャーにて使用率を確認) この現象についてそれぞれのCPUを効率的に使う方法として、何か御座いましたらご教示頂きたく存じます。 宜しく御願い致します。

  • スレッドに関する質問

    シングルスレッドよりもマルチスレッドにした方が、パフォーマンスが良くなるプログラミングの例を教えて下さい。

専門家に質問してみよう