スレッド (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);
新しいスレッドを生成します。
- 引数:
fn- スレッドで実行する関数(void* fn(void*)型) - 戻り値: スレッドハンドル
join
int join(ulong handle);
スレッドの完了を待機し、結果を取得します。
- 引数:
handle-spawnで取得したスレッドハンドル - 戻り値: スレッド関数の戻り値(int)
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を直接使用しています:
spawn→pthread_createjoin→pthread_joindetach→pthread_detachsleep_ms→usleep
最終更新: 2026-02-08