std::thread是 C++ 11 新引入的標準線程庫。在同樣是 C++ 11 新引入的 lambda 函數的輔助下,std::thread用起來特別方便:
int a = 1;
std::thread thread([a](int b) {
return a + b;
}, 2);
它唯一有點令人疑惑的地方在於其提供的join和detach函數,字面上的意思是前者合併線程,後者分離線程。無論是合併還是分離,都會導致std::thread::joinable()返回false,而在此之前為true(即使這個新建線程的任務已經執行完畢!)。
合併線程的含義比較清楚,就是綁定的線程合併到當前線程執行,當前線程被堵塞,直到被合併的線程執行完畢。
分離線程則是新創建的線程和std::thread對象分離,創建的線程獨立運行。std::thread將不再持有該線程。有人可能覺得這種毫無意義,但理論上還是有的,比如分離後,我們就可以析構std::thread對象,而不會影響創建的線程(創建的線程會繼續運行)。
int a = 1;
{
std::thread thread1([a](int b) {
return a + b;
}, 1);
thread1.detach();
}
{
std::thread thread2([a](int b) {
return a + b;
}, 2);
}
以上面代碼為例,thread1不會出錯,但thread2會導致程序退出。原因是std::thread的析構函數裡設置了如果線程既沒有合併也沒有分離,程序就會自動退出!
~thread() {
if (joinable()) std::terminate();
}
其原始碼位於https://gcc.gnu.org/onlinedocs/gcc-7.5.0/libstdc++/api/a00158_source.html,實現非常簡單,是基於pthread的封裝,其內容只有線程 ID :
class thread {
public:
typedef __gthread_t native_handle_type;
class id {
native_handle_type _M_thread;
};
private:
id _M_id;
}