プログラミング基礎概念

スレッド すれっど

プロセスマルチスレッド並行処理並列処理同期デッドロック
スレッドについて教えて

簡単に言うとこんな感じ!

料理で言うと「手」みたいなもの! 1本の手(シングルスレッド)だとひとつの作業しかできないけど、両手(マルチスレッド)使えば音楽を聴きながら料理できるよね。プログラムの中で複数の処理を同時進行させる仕組み、それがスレッドなんだ!


スレッドとは

スレッド(Thread)とは、プログラムの実行単位のうち、最も小さい独立した処理の流れのことです。英語の「thread(糸)」が語源で、1本の処理の流れをひとすじの糸にたとえています。プログラムが動く大きな入れ物(プロセス)の中に、複数のスレッドが同時に走ることができます。

通常、ひとつのプログラムが起動するとひとつのスレッド(メインスレッド)が生まれます。しかし、動画のダウンロードをしながら再生もしたい、といった場面では1本の流れでは対応できません。そこで複数のスレッドを作り、それぞれ別の仕事を担当させる「マルチスレッド」という方式が使われます。

スレッドは同じプロセスのメモリを共有するため、プロセスを複数起動するよりも軽量・高速並行処理を実現できます。その反面、複数のスレッドが同じデータを同時に書き換えようとする「競合状態(レースコンディション)」や、互いに相手の処理を待ち続ける「デッドロック」といった問題が起きやすく、設計の難しさも伴います。


スレッドの構造と種類

プロセスとスレッドの関係

単位たとえメモリ共有切り替えコスト
プロセス工場(建物ごと独立)❌ 独立した空間重い(コンテキストスイッチ大)
スレッド工場内の作業員✅ 同じ工場を共有軽い(コンテキストスイッチ小)
プロセス(例: Webブラウザ) スレッド 1 ページ描画 スレッド 2 ダウンロード スレッド 3 動画再生 共有メモリ空間(ヒープ・グローバル変数など) 各スレッド専有領域 スタック(ローカル変数)・プログラムカウンタ・レジスタ

スレッドの種類

種類説明主な使いどころ
ユーザースレッドアプリ側で管理。OSに依存しないJava, Python など
カーネルスレッドOS(カーネル)が直接管理より細かいCPU制御が必要なとき
グリーンスレッドOSとは別にランタイムが仮想的に管理Go のゴルーチン, Erlang など

覚え方:「スレッドは糸、プロセスは布」

布(プロセス)は複数の糸(スレッド)で織られている。糸は布の素材(メモリ)を共有しながら、それぞれ独立した道筋を走る。


歴史と背景

  • 1960年代 — IBMのOS/360で「タスク」という概念が登場。マルチプログラミング(複数プログラムの切り替え実行)が始まる
  • 1980年代 — UNIXの普及とともに「プロセス」が主要な実行単位に。ただしプロセス生成コストが重い問題が明確化
  • 1990年代初頭 — プロセスより軽量な実行単位として「スレッド」が注目。Pthreads(POSIX Threads)仕様が策定される(1995年)
  • 1990年代後半 — Java(1995年)が言語レベルでマルチスレッドをサポート。開発者がスレッドを意識する時代に
  • 2000年代 — マルチコアCPUの普及により、スレッドを使った真の並列処理が現実的になる
  • 2010年代以降 — Go言語の「ゴルーチン」、JavaScript の「Web Workers」など、より扱いやすいスレッド代替技術が台頭

シングルスレッドとマルチスレッドの比較

シングルスレッドとマルチスレッドは、それぞれ向き不向きがあります。「とにかくマルチスレッドにすれば速い」は間違いで、設計コストやデバッグの難しさも考慮が必要です。

シングルスレッド vs マルチスレッド シングルスレッド 処理A → 処理B → 処理C ✅ シンプルで理解しやすい ✅ デバッグが容易 ✅ 競合状態が起きない ❌ 1つが詰まると全体が止まる ❌ CPUコアをフル活用できない 代表例: JavaScript(メインスレッド) Python(GILによる制限) マルチスレッド スレッド1: 処理A スレッド2: 処理B スレッド3: 処理C ✅ 複数処理を同時進行 ✅ CPUコアを有効活用 ✅ 応答性が向上する ❌ 競合・デッドロックのリスク ❌ 設計・デバッグが複雑 代表例: Java, C++, Go, Rust

マルチスレッドを使う代表的なシーン

Webサーバー(例: Apache)
  ├── スレッド1 → ユーザーAのリクエストを処理
  ├── スレッド2 → ユーザーBのリクエストを処理
  └── スレッド3 → ユーザーCのリクエストを処理

動画編集ソフト
  ├── スレッド1 → 映像のデコード
  ├── スレッド2 → エフェクト処理
  └── スレッド3 → プレビュー表示

主要な同期・制御の仕組み

スレッドが増えると「同時に同じ場所を書き換えてしまう」問題が起きます。それを防ぐための仕組みが以下です。

仕組み読み方役割
ミューテックス(Mutex)みゅーてっくす鍵をかけて1スレッドだけ通す。Mutual Exclusion の略
セマフォせまふぉ同時に入れるスレッド数を制限する信号機
ロックろっく特定リソースを占有する仕組みの総称
アトミック操作あとみっくそうさ割り込み不可能な最小単位の操作

関連する規格・RFC

規格・RFC番号内容
IEEE POSIX 1003.1cPthreads(POSIXスレッド)の標準仕様。C言語でのスレッドAPIを規定

関連用語

  • プロセス — スレッドを格納するプログラムの実行単位。スレッドはプロセス内に存在する
  • マルチスレッド — 複数のスレッドを同時に実行して並行処理を実現する技術
  • 並行処理 — 複数の処理を交互・同時に進める考え方全般
  • 並列処理 — 複数のCPUコアを使って文字通り同時に処理を実行すること
  • デッドロック — 複数スレッドが互いにロック解放を待ち合い、永久に止まってしまう状態
  • 非同期処理 — 処理の完了を待たず次に進む手法。シングルスレッドで並行性を得る代替手段
  • コンテキストスイッチ — CPUが実行するスレッドを切り替える処理。頻繁すぎると性能低下の原因に
  • ゴルーチン — Go言語独自の軽量スレッド。数千〜数万個を同時に生成できる