マルチスレッドパターンとは?たくさんの処理を同時にこなすための定番の設計

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

マルチスレッドパターンとは(全体像)

スレッドは、プログラムの中で同時に進められる作業の単位。これを何本も動かすと処理が速くなるが、ぶつかり合いや待ち合わせの調整が必要になる。

その調整によく使われる「お決まりの設計」が、マルチスレッドパターンだ。料理を例にすると、「注文がたまったらどうさばくか」「人手をどう配るか」といった、現場でくり返し出てくる悩みへの定番の答えになっている。

押さえるのは、パターンごとに向いている場面が違うこと。ぜんぶ同じではない。


詳しく:代表パターンと「非同期≠並列」だけ覚えれば戦える

ここが記事の心臓部。試験でよく出る代表パターンを見ましょう。

代表的なマルチスレッドパターン

パターンしくみ身近な場面
スレッドプール働き手を事前に用意して使い回すWebサーバーの接続さばき
プロデューサ・コンシューマ作る側と使う側を“置き場”でつなぐログ収集・メッセージのキュー
リーダ・ライタ読むのは同時OK・書くのは1人だけデータベースの読み書き
非同期I/O待ち時間に別の仕事を進めるNode.js・nginx

一番よく出るのがスレッドプール。処理のたびに働き手(スレッド)を新しく雇うと、雇う手間が毎回かかって遅くなる。そこで先に何人か用意しておいて使い回すのがスレッドプールで、立ち上げの無駄を減らせる。

プロデューサ・コンシューマは、作る側(プロデューサ)と使う側(コンシューマ)の間に“置き場”(バッファ)を置くしくみ。置き場がいっぱいなら作る側が待ち、空なら使う側が待つ。スピードの違う2者をうまくつなげる。

ここで一番のひっかけが「非同期=並列」という誤解。非同期I/Oは「待ち時間をムダにせず別の仕事をする」考え方で、並列は「複数のCPUで本当に同時に動かす」こと。別ものなので混同しないように。

わかりやすく言い換えると

要するに、レストランの仕事わけでイメージするとラクです。

スレッドプール … ウェイターを5人常駐させて使い回す(注文のたびに雇わない)

プロデューサ・コンシューマ … キッチン(作る)とホール(出す)を、料理の置き台でつなぐ

非同期I/O … 1人のウェイターが、料理を待っている間に別の席の注文を取りに行く

つまり、「スレッドプール=使い回し」「非同期=待ち時間の活用」、この2点が試験の急所です。


試験のツボ

🔴 一番出る:スレッドプール

①スレッドを先に用意して使い回す

②毎回作り直す無駄を減らし、Webサーバーなどで速くなる

🔴 次に出る:非同期I/Oと並列の違い

①非同期I/Oは待ち時間に別の仕事を進める考え方

②並列は複数CPUで本当に同時に動かすこと(非同期とは別もの)

🟡 押さえると安定:プロデューサ・コンシューマ/リーダ・ライタ

①プロデューサ・コンシューマは“置き場”で作る側と使う側をつなぐ

②リーダ・ライタは読むのは同時OK・書くのは1人だけ


よくある間違い

「マルチスレッドパターンはどれも同じで、使い分けは不要である」→ ✗  パターンごとに向く場面が違う。置き場でつなぐ型、使い回す型などを使い分ける。

「非同期I/Oは並列と同じ意味である」→ ✗  非同期は待ち時間の活用、並列は複数CPUでの同時実行。別の概念。

「スレッドプールは処理のたびにスレッドを新しく作る」→ ✗  逆。先に用意して使い回す。毎回作る無駄を減らすのが目的。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(スレッドプール)

📝 オリジナル問題 1 スレッドプール

スレッドプールに関する次の記述のうち、正しいものはどれか。

  1. スレッドプールは処理のたびに新しいスレッドを作り、終わるたびに必ず捨てるしくみだとされる
  2. スレッドプールはスレッドを事前に用意して使い回すことで、生成にかかる無駄を減らすしくみだ
  3. スレッドプールはスレッドの使用を禁止して、処理をすべて1本にまとめるためのものだとされる
  4. スレッドプールは水を貯める設備のことで、プログラムの処理とは無関係なものだとされている
テクマスター
テクマスター 解答・解説

解答は 2 ですよ。

スレッドプールは、スレッドを先に用意しておいて使い回すしくみですね。処理のたびに新しく作る無駄を減らせるので、Webサーバーの接続さばきなどで速くなります。

選択肢1の「毎回作って捨てる」、選択肢3の「使用を禁止して1本にまとめる」、選択肢4の「水を貯める設備」はどれも誤りですよ。

選択肢判定理由
1毎回作り直すのではなく使い回す
2事前に用意して使い回し無駄を減らす
3並行処理を活かすためのしくみ
4水を貯める設備ではない

オリジナル問題2(非同期I/Oと並列)

📝 オリジナル問題 2 非同期I/Oと並列の違い

非同期I/Oと並列に関する次の記述のうち、正しいものはどれか。

  1. 非同期I/Oは待ち時間に別の仕事を進める考え方で、複数CPUで同時に動かす並列とは別ものだ
  2. 非同期I/Oと並列はまったく同じ意味で、どちらもCPUを1つしか使わないものだとされている
  3. 非同期I/Oは処理を必ず1つずつ順番にだけ進め、待ち時間も何もせず止まるものだとされている
  4. 非同期I/Oは画面に絵を描く技術のことで、処理の待ち時間とは関係がないものだとされている
テクマスター
テクマスター 解答・解説

解答は 1 ですよ。

非同期I/Oは、I/Oの待ち時間をムダにせず別の仕事を進める考え方ですね。一方、並列は複数のCPUで本当に同時に動かすこと。この2つは別ものなので、混同しないようにしましょう。

選択肢2の「同じ意味」、選択肢3の「待ち時間も止まる」、選択肢4の「絵を描く技術」はどれも誤りですよ。

選択肢判定理由
1非同期は待ち時間の活用・並列は同時実行で別
2同じ意味ではない
3待ち時間に別の仕事を進める
4絵を描く技術ではない

オリジナル問題3(プロデューサ・コンシューマ)

📝 オリジナル問題 3 プロデューサ・コンシューマ

プロデューサ・コンシューマに関する次の記述のうち、正しいものはどれか。

  1. プロデューサ・コンシューマはデータを暗号化して守るためだけのしくみだとされているものである
  2. プロデューサ・コンシューマは作る側と使う側がたがいに相手を待つことは一切ないものだとされる
  3. プロデューサ・コンシューマは作る側と使う側を“置き場”でつなぎ、満杯や空のときは待つしくみだ
  4. プロデューサ・コンシューマは画面の表示色を決める設定のことで、処理の連携とは無関係だとされる
テクマスター
テクマスター 解答・解説

解答は 3 ですよ。

プロデューサ・コンシューマは、作る側(プロデューサ)と使う側(コンシューマ)を“置き場”(バッファ)でつなぐしくみですね。置き場が満杯なら作る側が待ち、空なら使う側が待つことで、スピードの違う2者をうまくつなげます。

選択肢1の「暗号化のため」、選択肢2の「待つことはない」、選択肢4の「表示色の設定」はどれも誤りですよ。

選択肢判定理由
1暗号化のしくみではない
2満杯や空のときは待ち合わせる
3置き場でつなぎ満杯・空で待つ
4表示色の設定ではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る