スレッドとは何ですか?
プロセス内で実際にコードを実行するフロー
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
Process(プロセス)がメモリやファイルのようなリソースを含むボウルであれば、Thread(スレッド)はその中で実際に命令を実行するフローである。
プロセスが作成されると通常は1つのメインスレッドが開始され、必要に応じて追加のスレッドを作成できます。
同じプロセスのスレッドはリソースを共有します
同じプロセスに属するスレッドは、コード、グローバルデータ、ヒープ、オープンファイルを共有します。 代わりに、各スレッドには独自のStack、レジスタ状態、実行位置があります。
1つのプロセス
┌──────────────────────────┐
│コード/データ/ヒープ共有│
├────────────┬─────────────┤
│ Thread A │ Thread B │
│ Stack A │ Stack B │
│ Register A │ Register B │
└────────────┴─────────────┘
2つのスレッドが同じオブジェクトのアドレスを使用できる理由は、ヒープを共有するためです。 一方、関数のローカル変数は基本的に各スレッドのスタックに生成されるため、互いに分離されます。
なぜスレッドを使用するのですか?
ゲームを例にとると、メインスレッドが入力と画面更新を処理している間、作業スレッドが経路探索やリソースロードを行うことができる。 CPUコアが複数あれば、異なるスレッドが実際に同時に実行されることもある。
std::thread worker([]()
{
LoadResources();
});
UpdateGame();
worker.join();
join()は、作業スレッドが終了するまで現在のスレッドを待つようにします。
プロセスとスレッドの違い
プロセスは基本的にメモリが隔離されており、あるプロセスの問題が別のプロセスにすぐに広がりにくい。 しかし、生成と通信コストは比較的大きい。
スレッドは同じメモリを共有するため、データのやり取りが簡単で比較的軽いです。 代わりに、間違ったポインタアクセスや同期バグが同じプロセス全体を壊す可能性があります。
プロセス:資源所有と隔離の単位
スレッド:CPUが実行するフローの単位
スレッドが多いと無条件に速くならない。 作業を分けるコスト、ロック待機、キャッシュ衝突、コンテキスト交換コストが計算ゲインより大きくなると、むしろ遅くなることがあります。