1. 程式人生 > >深入應用C++11 筆記---多執行緒 (六)

深入應用C++11 筆記---多執行緒 (六)

C++11 多執行緒

1. 執行緒的建立

  • 使用執行緒函式或者函式物件,並且可以同時制定執行緒函式的引數

    
    #include<thread>
    
    void func(){/*do something*/}
    int main()
    {
      std::thread t(func);
      t.join();//阻塞執行緒,直到函式執行結束
      //t.detach();   將執行緒和執行緒物件分離
      return 0;
    }

    函式func將會運行於執行緒物件t中,join函式將會阻塞執行緒,直到執行緒函式執行結束,如果執行緒函式由返回值,返回值將會被忽略。如果不希望執行緒被阻塞執行,可以呼叫執行緒的detach()

    方法,將執行緒和執行緒物件分離,讓執行緒作為後臺執行緒去執行。 detach之後就無法再和執行緒發生聯絡了。主程序結束的時候,即便是detach()出去的子執行緒不管有沒有完成都會被強制殺死

  • 執行緒還可以接收任意個數的引數

    void func(int i,double d,const std::string& s)
    {
      std::cout<<i<<","<<d<<","<<s<<std::endl;
    }
    int main()
    {
      std::thread t(func,1,2,"test");
      t.join();
      return
    0; }

    注意:std::thread 出了作用域之後將會析構,如果執行緒函式沒有執行完將會發生錯誤,因此,需要保證執行緒函式的生命週期線上程變數std::thread的生命週期之內。

  • 執行緒不能複製,但是可以移動

    
    #include<thread>
    
    void func(){/*do something*/}
    int main()
    {
      std::thread t(func);
      std::thread t1(std::move(t));
      t.join();
      t2.join();
      return 0;
    }
  • 通過將執行緒物件儲存到一個容器中,以保證執行緒物件的生命週期。

    ​ 由於執行緒物件可能先於執行緒函式結束,所以應該保證執行緒物件的生命週期線上程函式執行完時仍然存在。可以通過join阻塞等待執行緒函式執行完成,或者通過detach方法讓程式在後臺執行,還可以通過將執行緒物件儲存到一個容器中,以保證執行緒物件的生命週期。

    std::vector<std::thread> g_list;
    std::vector<std::shared_ptr<std::thread>> g_list2;
    void CreateThread()
    {
      std::thread t(func);
      g_list.push_back(std::move(t));
      g_list2.push_back(std::make_shared<std::thread>(func));
    }
    
    int main()
    {
      CreateThread();
      for(auto& thread:g_list)
      {
          thread.join;
    }
      for(auto& thread:g_list2)
      {
          thread->join();
      }
      return 0;
    }

2. 執行緒的基本用法

  • 獲取當前資訊

    ​ 執行緒可以獲取當前執行緒的ID,還可以獲取CPU核心數量

    void fun(){/*do something*/}
    int main()
    {
      std::thread t(func);
      cout<<t.get_id()<<endl;//獲取當前執行緒ID
      //獲取當前CPU核數,如果獲取失敗則返回0
      cout<<std::thread::hardware_concurrency()<<endl;
      return 0;
    }
  • 執行緒休眠

    std::this_thread::sleep_for(std::chrono::seconds(3));//執行緒休眠3

    宣告:以上主要來源於深入應用C++11 這本書,強烈推薦