【すれっど】

スレッド とは?

💡 プロセス内の「処理の流れ」、複数スレッドで並列処理を実現する
📌 このページのポイント
プロセス メインスレッド 初期化 スレッド生成 待機/結合 終了処理 スレッド 1 データ処理A 書き込みA スレッド 2 データ処理B 書き込みB ← 同時並列実行 → 共有メモリ(同じプロセス内) スレッドはプロセス内のメモリを共有するため高速に通信できる
1つのプロセス内で複数の処理を並列に実行
ひよこ ひよこ

スレッドって何?

ペンギン先生 ペンギン先生

プログラムの中の「処理の流れ」の単位。1つのプロセスに複数のスレッドを持てるのがマルチスレッド。例えばブラウザが「HTMLを表示するスレッド」「ネットワーク通信スレッド」「JavaScriptを実行するスレッド」などを同時に動かしている。

ひよこ ひよこ

プロセスとどう違うの?

ペンギン先生 ペンギン先生

プロセスはOSから独立したメモリ空間を持つ実行単位(完全に独立)。スレッドは同じプロセス内でメモリを共有する実行単位(軽量だが干渉する)。スレッドの方が生成コストが低いため、高い並列性が必要なときに使う。

ひよこ ひよこ

おもしろい!マルチスレッドで何が難しいの?

ペンギン先生 ペンギン先生

複数スレッドが同じデータに同時に書き込む「レースコンディション」が発生しやすい。例えば「残高100円から両方のスレッドが50円引いて0円にするはずが、タイミングによって50円になる」みたいなバグ。セマフォやロックで排他制御して防ぐ必要がある。

ひよこ ひよこ

JavaScriptはシングルスレッドって聞いたけど、じゃあ遅くないの?

ペンギン先生 ペンギン先生

JavaScriptはメインスレッドは1つだけど、非同期処理async/awaitPromise)でI/O待ちの間に他の処理を進められるイベントループの仕組みがあるんだ。ネットワークやファイルI/Oの待ち時間が多いWebサーバでは、この方式がマルチスレッドに匹敵する効率を出せるよ。

ひよこ ひよこ

Web Workerってマルチスレッドとは違うの?

ペンギン先生 ペンギン先生

Web Workerはブラウザで重い計算をバックグラウンドスレッドで実行する仕組みだよ。ただし通常のマルチスレッドと違ってメモリを共有しない(メッセージパッシングでデータをやり取りする)から、レースコンディションが起きにくい安全設計になっている。Node.jsにもWorker Threadsという同様の仕組みがある。SharedArrayBufferを使えばメモリ共有もできるけど、Atomics API排他制御が必要になるんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
スレッドって出てきたら「プロセス内の並列処理単位、マルチスレッドで複数コアを活用できるが共有メモリの競合に注意」と思えばOK!
📖 おまけ:英語の意味
「Thread」 = 糸・処理の流れ
💬 プログラムの実行の「流れ」を糸(thread)に例えた。複数の糸が絡み合うように並列に処理が進むイメージ。1960年代のOSから概念はあり、マルチコアCPU普及で重要性が増した
← 用語集にもどる