1. 程式人生 > >並發編程(2)線程管理

並發編程(2)線程管理

同時 () 線程數 切換 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)線程管理