深入應用C++11 筆記---多執行緒 (六)
阿新 • • 發佈:2019-02-13
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()
執行緒還可以接收任意個數的引數
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
注意: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 這本書,強烈推薦