1. 程式人生 > >c++11 多線程新特性學習 (1) 管理線程

c++11 多線程新特性學習 (1) 管理線程

his on() argc 等待 通過 運行 int 選擇 如果

1.基礎介紹

 c++11中,線程是通過std::thread對象來開始的,用法為

#include<thread> //必須包含的頭文件
void do_work(){
     std::cout<<"Hello World";      
}
int main(){
     std::thread my_thread(do_work);
}

這樣就開啟了一個新線程,並且運行的是do_work這個函數

要註意的是當給線程構造函數傳遞一個臨時的且未命名的變量,要用新的方法如下

#include "thread"

void Hello(){
    std::cout 
<< std::this_thread::get_id()<<std::endl; } class A{ public: void operator () () const { Hello(); } }; int main(int argc, char *argv[]) { std::thread t{ A() };// or std::thread t((A())); std::cout << std::this_thread::get_id()<<std::endl; system(
"pause"); }//會輸出兩個線程id

以上代碼會在新線程中執行Hello函數,其中這裏類名後跟括號的叫匿名對象,即默認構造一個對象,但是這個對象只存在於構造該對象的那行代碼,離開構造匿名對象的那行代碼後立即調用析構函數,如

class A{
public:
    A(){
        std::cout << "A";
    }
};
int main(int argc, char *argv[]) {
    A();
    system("pause");
}//這裏會輸出A

而這種匿名對象當做std::thread的參數的話就會被當做是函數而不是對象,所以要用上述特殊的方法

要傳遞參數給線程時,用一下方式

void f(int i,int d);
void fun()
{
    std::thread t(f,1,10);
}

這裏1就是參數i,10就是參數d.另外要註意這裏傳參時調用的函數會盲目的復制傳進區的參數而不是原先的值,如果不想調用復制使用原值的話,使用std::thread t(f,std::ref(1),10)即可

2.線程管理

  一旦開始了線程,你需要顯式決定是等它完成還是讓它自行運行,對於c++11 來說,兩個方式分別用 jion() ,detach();如果你在std::thread對象銷毀前沒做決定,那麽你的程序會在std::thread的析構函數調用std::terminate()終止.

如果選擇分離,那麽該線程可能在std::thread對象被銷毀後很久還在運行,這種情況下要註意防止調用一個可能在線程結束前就被銷毀的對象

  調用join(),則主線程就會一直在那裏等待新起的線程執行完才會繼續往下執行.你只能對一個給定線程調用join()或者 detach()一次,可以用joinable()判斷

c++11 多線程新特性學習 (1) 管理線程