1向線程函數傳遞參數比較簡單,一般的形式如下
void f(int i,std::string const& s);
std::thread t(f,3, "hello");
但仍然有一些特殊情況,有時換我們想傳遞一些引用,但是發現我們傳遞的對象是對象的拷貝而不是對象本身,如下所示
void update_data_for_widget(widget_id w,widget_data& data); // 1
void oops_again(widget_id w)
{
widget_data data;
std::thread t(update_data_for_widget,w,data); // 2
display_status();
t.join();
process_widget_data(data); // 3
}
這里就要注意2啟動的新進程中傳遞的參數並不是參數本身,而是參數的拷貝,如果我們向傳遞參數本身的話,要這么寫
std::thread t(update_data_for_widget,w,std::ref(data))
class X
{
public:
void do_lengthy_work();
};
X my_x;
std::thread t(&X::do_lengthy_work,&my_x); // 1
在這段代碼中,將my_x.do_lengthy_work作為線程函數,my_x的地址1作為指針對象提供給函數,如果函數有參數的話可以為成員函數提供參數: std::thread 構造函數的第三個參數就是成員函數
的第一個參數,以此類推。
class X
{
public:
void do_lengthy_work(int num);
};
X my_x;
std::thread t(&X::do_lengthy_work,&my_x,num); // 1