join():阻塞當前線程,等待子線程結束,回收資源detach():分離線程,子線程獨立運行,資源由運行時自動回收(守護線程)detach(),不能再 join(),否則拋異常/未定義行為
int main() {
std::thread t([]{ /* work */ });
// t.join(); // 選項 1
t.detach(); // 選項 2
// t.join(); // 錯誤!已 detach 不能 join
return 0;
}
在 join() 或 detach() 前檢查 joinable(),避免重複操作或對空線程對象操作。
#include <iostream>
#include <thread>
void mythread() { /* do stuff */ }
int main() {
std::thread foo; // 默認構造,無關聯線程
std::thread bar(mythread); // 關聯線程
cout << boolalpha;
cout << "foo joinable: " << foo.joinable() << " "; // false
cout << "bar joinable: " << bar.joinable() << "\n"; // true
if (foo.joinable()) foo.join();
if (bar.joinable()) bar.join();
cout << "After join - foo: " << foo.joinable() << " "; // false
cout << "bar: " << bar.joinable() << "\n"; // false
return 0;
}
std::thread t(func);
class MyFunctor {
public:
void operator()() { std::cout << "functor\n"; }
};
int main() {
MyFunctor fnctor;
std::thread t(fnctor); // 拷貝 fnctor 到線程內部
t.join();
}
// std::thread t(MyFunctor()); // 錯誤!聲明函數 t 返回 thread,參數為函數指針
std::thread t((MyFunctor())); // 正確:額外括號強制構造臨時對象
// 或 C++11 統一初始化
std::thread t{MyFunctor()};
std::thread t([]{ std::cout << "lambda thread\n"; });
class A { public: void func(int x) {} };
A obj;
std::thread t(&A::func, &obj, 42); // 對象指針作為第一參數
join() 確保線程結束,資源確定性釋放detach()join() 或 detach(),否則 std::terminatejoinable() 守護所有線程操作std::ref 或傳值)