並發編程(2)線程管理
阿新 • • 發佈:2018-06-02
同時 () 線程數 切換 har 關聯 code hardware 例如
一、啟動線程
void do_something(); std::thread t(do_something);
註意t是創建的線程,do_something是函數對象,不要傳入函數。提供的函數對象會復制到新線程的存儲空間當中,函數對象的執行和調用都在線程的內存空間中進行。
join(),detach()
二、線程傳參
線程調用傳參
void f(int i,std::string const& s); std::thread t(f,3,"hello");
註意線程初始化不會對舛訛的參數隱式轉換,需要顯式轉換。
三、轉移線程所有權
std::move()來轉移線程所有權,轉移後源線程將和執行線程沒有關聯。
void some_function(); void some_other_function(); std::thread t1(some_function); // 1 std::thread t2=std::move(t1); // 2 t1=std::thread(some_other_function); // 3 std::thread t3; // 4 t3=std::move(t2); // 5 t1=std::move(t3); // 6 賦值操作將使程序崩潰,T1已經有一個線程了。
四、運行時決定線程數量
std::thread::hardware_concurrency()這個函數將返回能同時並發在一個程序中的線程數量。例如,多核系統中,返回值可以是CPU核芯的數量。因為上下文頻繁的切換會降低線程的性能,所以肯定不想啟動的線程數多於硬件支持的線程數量。
並發編程(2)線程管理