程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++0x概覽:多線程(1)

C++0x概覽:多線程(1)

編輯:關於C++

++ 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();

啟動線程就這麼簡單。接下來我會介紹一下線程間如何共享數據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved