スレッド (std::thread)

Cmではstd::threadモジュールを使用してマルチスレッドプログラミングを行います。

基本的な使い方

スレッドの生成と待機

import std::thread::spawn;
import std::thread::join;
import std::thread::sleep_ms;

void* worker(void* arg) {
    println("Worker: 開始");
    sleep_ms(100);
    println("Worker: 完了");
    return 42 as void*;
}

int main() {
    // スレッドを生成
    ulong t = spawn(worker as void*);
    
    // スレッド完了を待機し、結果を取得
    int result = join(t);
    println("結果: {result}");  // 結果: 42
    
    return 0;
}

API リファレンス

spawn

ulong spawn(void* fn);

新しいスレッドを生成します。

join

int join(ulong handle);

スレッドの完了を待機し、結果を取得します。

detach

void detach(ulong handle);

スレッドをデタッチします。デタッチされたスレッドはバックグラウンドで実行され、メインスレッド終了時に自動的に終了します。

sleep_ms

void sleep_ms(int ms);

現在のスレッドを指定ミリ秒停止します。

並列処理の例

import std::thread::spawn;
import std::thread::join;
import std::thread::sleep_ms;

void* calc10(void* arg) {
    sleep_ms(50);
    return 10 as void*;
}

void* calc20(void* arg) {
    sleep_ms(50);
    return 20 as void*;
}

int main() {
    // 並列にスレッド生成
    ulong t1 = spawn(calc10 as void*);
    ulong t2 = spawn(calc20 as void*);
    
    // 両方の完了を待機
    int r1 = join(t1);
    int r2 = join(t2);
    
    println("合計: {r1 + r2}");  // 合計: 30
    
    return 0;
}

join vs detach

操作 動作
join(t) スレッド完了まで待機、結果を取得
detach(t) バックグラウンド実行、結果は取得不可

detachの注意点

detachされたスレッドは、メインスレッドが終了すると強制終了されます:

void* long_task(void* arg) {
    // 1秒かかる処理
    sleep_ms(1000);
    println("完了");  // メインが先に終了すると出力されない
    return 0 as void*;
}

int main() {
    ulong t = spawn(long_task as void*);
    detach(t);
    
    // 100ms後にメイン終了
    sleep_ms(100);
    // → long_taskは途中で強制終了
    
    return 0;
}

内部実装

std::threadはPOSIXのpthreadを直接使用しています:


最終更新: 2026-02-08