向執行緒函式傳遞引數在構造執行緒物件時就可以完畢。可是要記住,預設情況下是把引數複製到執行緒內部,即使在函式中使用的是引用。比如
void f(int i,std::string const &s);上面**中,函式f的第二個引數是std::string,傳遞的是char const *會轉換為string。std::thread t(f,3,"hello");
當使用指標指向自己主動變數時。要特別注意:
void f(int i, std::string const& s);在這樣的情況下,指標指向區域性變數buffer,然後傳遞到新建立的執行緒。void oops(int some_param)
非常可能會發生函式oops已經終止。可是buffer還沒有轉換為std::string。這是buffer已經銷毀。解決辦法就是在傳遞之前就轉換:
void f(int i, std::string const& s);這是,依賴buffer想std::string的隱式轉換,之後作為函式引數void oops(int some_param)
可能會出現和上面相反的情況:執行緒拷貝了物件例項,可是你想要傳遞引用。在使用引用傳遞引數。執行緒更新資料時:
void update_data_for_widget(widget_id w,widget_data& data);雖然update_data_for_widget希望第二個引數用引用傳遞,可是std::thread的建構函式不知道,這是函式的引數會被拷貝。當呼叫update_data_for_widget時,會傳遞拷貝data的引用,而不是data的引用。當執行緒終止,執行緒內部的拷貝析構,可是函式process_widget_data傳遞的是未更新的data。對於熟悉std:bind的人來說,立即就能想到解決的辦法:你須要使用std::ref包裝引數。須要更改執行緒建立形式為:void oops_again(widget_id w)
std::thread t(update_data_for_widget,w,std::ref(data));假設你熟悉std::bind,引數傳遞的語法就easy理解。
由於std::thread的建構函式和std::bind都是使用相同的原理。這也就是說,你能夠傳遞成員函式的指標作為函式引數,假如你使用物件指標作為第乙個引數。
class x上面**會在新執行緒呼叫my_x.do_lengthy_work()。由於my_x的位址作為物件指標。你也能夠提供引數比如成員函式呼叫:std::thread的第三個引數將會成為成員函式的第乙個引數。;x my_x;
std::thread t(&x::do_length_work,&my_x);
另一種情況是函式引數物件不能拷貝,僅僅能轉移其全部權(比如stl中的auto_ptr指標)。std::unique_ptr就是這種乙個樣例。std::unique指標一次僅僅能指向乙個物件。當指標析構時。物件也就被析構了。在賦值時是轉移全部權(像auto_ptr)。
在使用時,當物件是暫時物件時,會自己主動呼叫move,當是個變數時必須呼叫move。
void process_big_object(std::unique_ptr);std::unique_ptrp(new big_object);
p->prepare_data(42);
std::thread t(process_big_object,std::move(p));
管理執行緒之向執行緒函式傳遞引數
向執行緒函式傳遞引數在構造執行緒物件時就可以完畢。可是要記住,預設情況下是把引數複製到執行緒內部,即使在函式中使用的是引用。比如 void f int i,std string const s std thread t f,3,hello 上面 中,函式f的第二個引數是std string,傳遞的是...
多執行緒之向執行緒傳遞引數
建立物件,初始化物件中的一些值,然後在start 方法中呼叫該物件方法 通過lambda表示式 thread.start方法 static void count object iterations static void countnumbers int iterations prints thre...
管理執行緒之建立執行緒
基本的執行緒管理包括 1 建立執行緒。2 等待它結束或在後台執行。3 向執行緒函式傳遞引數,更改執行緒物件所有權。4 選擇執行緒和使用特定執行緒。void do some work std thread my thread do some work 這是最簡單的情況,std thread還可以使用可...