++ 0x 標准將增加對多線程的支持。以後所有的編譯器都必須遵循新標准中對多線程的規定,這將會給不同平台上程序的移植帶來很大的方便。
讓我們先來看看std::thread類,它負責管理線程的執行過程。
啟動線程
我們創建一個std::thread類的實例來啟動一個新線程,用一個線程函數作為構造函數的參數。如
void do_work();
std::thread t(do_work);
std::thread類也接受一個函數對象作為參數。
class do_work
{
public:
void operator()();
};
do_work dw;
std::thread t(dw);
注意這裡只是傳了一個對象的拷貝進去。如果想傳遞對象本身(你應該確保在線程結束前它沒有被銷毀),可以使用std::ref。
do_work dw;
std::thread t(std::ref(dw));
很多創建線程的API允許傳遞一個參數給線程,例如long或void*。Std::thread也支持參數,並且可以是任意類型任意個數的參數。
void do_more_work(int i,std::string s,std::vector<double> v);
std::thread
t(do_more_work,42,"hello",std::vector<double>(23,3.141));
也可以用std::ref傳引用。
void foo(std::string&);
std::string s;
std::thread t(foo,std::ref(s));
知道了怎麼啟動線程,那我們如何等待線程結束呢?新標准中有個術語叫joining來表示與線程協同工作, 我們使用成員函數join()
void do_work();
std::thread t(do_work);
t.join();
如果你不想joining你的線程,可以銷毀線程對象或者調用detach()。
void do_work();
std::thread t(do_work);
t.detach();
啟動線程就這麼簡單。接下來我會介紹一下線程間如何共享數據。