マルチスレッドパターンとは(全体像)
スレッドは、プログラムの中で同時に進められる作業の単位。これを何本も動かすと処理が速くなるが、ぶつかり合いや待ち合わせの調整が必要になる。
その調整によく使われる「お決まりの設計」が、マルチスレッドパターンだ。料理を例にすると、「注文がたまったらどうさばくか」「人手をどう配るか」といった、現場でくり返し出てくる悩みへの定番の答えになっている。
押さえるのは、パターンごとに向いている場面が違うこと。ぜんぶ同じではない。
詳しく:代表パターンと「非同期≠並列」だけ覚えれば戦える
ここが記事の心臓部。試験でよく出る代表パターンを見ましょう。
代表的なマルチスレッドパターン
| パターン | しくみ | 身近な場面 |
|---|---|---|
| スレッドプール | 働き手を事前に用意して使い回す | 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本にまとめるためのものだとされる
- スレッドプールは水を貯める設備のことで、プログラムの処理とは無関係なものだとされている
解答は 2 ですよ。
スレッドプールは、スレッドを先に用意しておいて使い回すしくみですね。処理のたびに新しく作る無駄を減らせるので、Webサーバーの接続さばきなどで速くなります。
選択肢1の「毎回作って捨てる」、選択肢3の「使用を禁止して1本にまとめる」、選択肢4の「水を貯める設備」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 毎回作り直すのではなく使い回す |
| 2 | ✓ | 事前に用意して使い回し無駄を減らす |
| 3 | ✗ | 並行処理を活かすためのしくみ |
| 4 | ✗ | 水を貯める設備ではない |
オリジナル問題2(非同期I/Oと並列)
非同期I/Oと並列に関する次の記述のうち、正しいものはどれか。
- 非同期I/Oは待ち時間に別の仕事を進める考え方で、複数CPUで同時に動かす並列とは別ものだ
- 非同期I/Oと並列はまったく同じ意味で、どちらもCPUを1つしか使わないものだとされている
- 非同期I/Oは処理を必ず1つずつ順番にだけ進め、待ち時間も何もせず止まるものだとされている
- 非同期I/Oは画面に絵を描く技術のことで、処理の待ち時間とは関係がないものだとされている
解答は 1 ですよ。
非同期I/Oは、I/Oの待ち時間をムダにせず別の仕事を進める考え方ですね。一方、並列は複数のCPUで本当に同時に動かすこと。この2つは別ものなので、混同しないようにしましょう。
選択肢2の「同じ意味」、選択肢3の「待ち時間も止まる」、選択肢4の「絵を描く技術」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 非同期は待ち時間の活用・並列は同時実行で別 |
| 2 | ✗ | 同じ意味ではない |
| 3 | ✗ | 待ち時間に別の仕事を進める |
| 4 | ✗ | 絵を描く技術ではない |
オリジナル問題3(プロデューサ・コンシューマ)
プロデューサ・コンシューマに関する次の記述のうち、正しいものはどれか。
- プロデューサ・コンシューマはデータを暗号化して守るためだけのしくみだとされているものである
- プロデューサ・コンシューマは作る側と使う側がたがいに相手を待つことは一切ないものだとされる
- プロデューサ・コンシューマは作る側と使う側を“置き場”でつなぎ、満杯や空のときは待つしくみだ
- プロデューサ・コンシューマは画面の表示色を決める設定のことで、処理の連携とは無関係だとされる
解答は 3 ですよ。
プロデューサ・コンシューマは、作る側(プロデューサ)と使う側(コンシューマ)を“置き場”(バッファ)でつなぐしくみですね。置き場が満杯なら作る側が待ち、空なら使う側が待つことで、スピードの違う2者をうまくつなげます。
選択肢1の「暗号化のため」、選択肢2の「待つことはない」、選択肢4の「表示色の設定」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 暗号化のしくみではない |
| 2 | ✗ | 満杯や空のときは待ち合わせる |
| 3 | ✓ | 置き場でつなぎ満杯・空で待つ |
| 4 | ✗ | 表示色の設定ではない |
まとめ
押さえどころ
- 🔴 スレッドプール = 働き手(スレッド)を先に用意して使い回す。毎回作る無駄を減らし速くなる。
- 🔴 非同期I/O = 待ち時間に別の仕事を進める考え方。複数CPUで同時に動かす「並列」とは別もの。
- 🟡 プロデューサ・コンシューマ/リーダ・ライタ = 置き場でつなぐ/読むのは同時OK・書くのは1人だけ。
次に学ぶ
執筆: SikakuQuest編集部