線程就是,在同一程式同一時間內允許執行不同函數的離散處理隊列。 這使得一個長時間去進行某種特殊運算的函數在執行時不阻礙其他的函數變得十分重要。 線程實際上允許同時執行兩種函數,而這兩個函數不必相互等待。
一旦一個應用程式啟動,它僅包含一個預設線程。 此線程執行 main() 函數。 在 main()中被調用的函數則按這個線程的上下文順序地執行。 這樣的程式稱為單線程程式。
反之,那些建立新的線程的程式就是多線程程式。 他們不僅可以在同一時間執行多個函數,而且這在如今多核盛行的時代顯得尤為重要。 既然多核允許同時執行多個函數,這就使得對開發人員相應地使用這種處理能力提出了要求。 然而線程一直被用來當並發地執行多個函數,開發人員現在不得不仔細地構建應用來支援這種並發。 多線程編程知識也因此在多核系統時代變得越來越重要。
建立線程裡執行的那個函數的名稱被傳遞到 boost::thread 的建構函式。 一旦上述樣本中的變數t 被建立,該 thread() 函數就在其所線上程中被立即執行。 同時在 main() 裡也並發地執行該 thread() 。
為了防止程式終止,就需要對建立線程調用 join() 方法。 join() 方法是一個阻塞調用:它可以暫停當前線程,直到調用 join() 的線程運行結束。 這就使得main() 函數一直會等待到 thread() 運行結束。
正如在上面的例子中看到,一個特定的線程可以通過諸如 t 的變數訪問,通過這個變數等待著它的使用 join() 方法終止。 但是,即使 t 越界或者析構了,該線程也將繼續執行。 一個線程總是在一開始就綁定到一個類型為 boost::thread 的變數,但是一旦建立,就不在取決於它。 甚至還存在著一個叫 detach() 的方法,允許類型為boost::thread 的變數從它對應的線程裡分離。 當然了,像 join() 的方法之後也就不能被調用,因為這個變數不再是一個有效線程。
任何一個函數內可以做的事情也可以在一個線程內完成。 歸根結底,一個線程只不過是一個函數,除了它是同時執行的。 在上述例子中,使用一個迴圈把5個數字寫入標準輸出資料流。 為了減緩輸出,每一個迴圈中調用wait() 函數讓執行延遲了一秒。 wait() 可以調用一個名為sleep() 的函數,這個函數也來自於 Boost.Thread,位於 boost::this_thread 名空間內。
#include<iostream>
#include<boost/thread.hpp>
using namespace std;
void threadFunc(){
cout<<"hello boost threads!"<<endl;
}
void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
void thread()
{
for (int i = 0; i < 5; ++i)
{
wait(1);
std::cout << i << std::endl;
}
}
struct ThreadFunc2{
void operator()(const int & id){
cout<<"thread #"<<id<<"hello boost Threads from operator!";
}
};
int main(){
boost::thread t(threadFunc);
t.join();
boost::thread t2(ThreadFunc2(),2);
t2.join();
boost::thread t3(thread());
t3.join();
return 1;
}
編譯後輸出:
hello boost threads!
thread #2hello boost Threads from operator!