0Pricing
C++ Academy · レッスン

std::threadのjoinとdetach

std::threadでスレッドを生成し、joinとdetachを使い分けます。

「std::threadのjoinとdetach」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

std::threadクラス

<thread>ヘッダーは、C++11でスレッド機能を標準ライブラリに導入しました。各std::threadインスタンスは、1つのOSスレッドを表します。

スレッドの生成

呼び出し可能オブジェクト(関数、ラムダ式、ファンクター)をコンストラクターに渡します。スレッドは直ちに実行を開始します。

#include <thread>
#include <iostream>

void worker() { std::cout << "running on thread\n"; }

int main() {
    std::thread t(worker);
    t.join();    // wait for it to finish
}

引数の受け渡し

コンストラクターを介して、呼び出し可能オブジェクトに引数を転送します。

std::thread t([](int n) { std::cout << n; }, 42);
t.join();

参照渡し

引数を参照渡しするにはstd::refを使用します。これを使わない場合、スレッドはコピーを受け取ります。

int counter = 0;
std::thread t([](int& c) { ++c; }, std::ref(counter));
t.join();
std::cout << counter;   // 1

join() — 完了を待機する

join()を呼び出すと、対象のスレッドが終了するまで呼び出し元のスレッドをブロックします。join後、そのスレッドはjoin可能ではなくなります。

detach() — 独立して実行する

detach()を呼び出すと、スレッドを独立して実行します。std::threadが破棄された後も実行を続けます。スレッドが終了すると、リソースはOSによって解放されます。

std::thread t([]() { /* background work */ });
t.detach();   // we no longer track it

joinable()

スレッドをjoinまたはdetachできるかどうかを確認します。joinまたはdetachされたスレッドは、join可能ではなくなります。

joinの呼び出し忘れ:終了

std::threadがjoin可能なまま破棄されると、プログラムはstd::terminateを呼び出します。破棄する前に、必ずjoinまたはdetachしてください。

RAIIラッパー

デストラクターでjoinする小さなRAIIラッパーを作成します。または、std::jthread(C++20)を使用します。こちらは自動的にjoinします。

#include <thread>
// C++20
std::jthread t([] { /* work */ });
// t joins automatically when destroyed

ハードウェアの並行性

std::thread::hardware_concurrency()でハードウェアスレッド数を取得します。スレッドプールのサイズ設定に使用できます。

スレッドID

各スレッドには一意のIDがあります。現在のスレッドのIDはstd::this_thread::get_id()で取得します。

スレッドをスリープさせる

std::this_thread::sleep_for(duration)を使用すると、現在のスレッドを一時停止できます。

#include <chrono>
using namespace std::chrono_literals;
std::this_thread::sleep_for(500ms);

簡単な確認

join可能なstd::threadで、join()またはdetach()を呼び出す前に破棄するとどうなりますか?

まとめ

呼び出し可能オブジェクトとstd::threadを使ってスレッドを生成します。スレッドオブジェクトが破棄される前に、必ずjoin()またはdetach()を呼び出してください。あるいは、自動的にjoinするC++20のstd::jthreadを使用します。

よくある質問

「std::threadのjoinとdetach」レッスンは無料ですか?

はい。「std::threadのjoinとdetach」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「std::threadのjoinとdetach」で何を学びますか?

std::threadでスレッドを生成し、joinとdetachを使い分けます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「std::threadのjoinとdetach」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::threadのjoinとdetach
  2. std::mutex、lock_guard、unique_lock
  3. 条件変数とワーカーパターン
  4. std::asyncとstd::futureの基本
← C++ Academyに戻る