C++ Linux 多線程之創建、管理線程


線程就是,在同一程序同一時間內同意運行不同函數的離散處理隊列。 這使得一個長時間去進行某種特殊運算的函數在運行時不阻礙其它的函數變得十分重要。 線程實際上同意同一時候運行兩種函數,而這兩個函數不必相互等待。

一旦一個應用程序啟動。它僅包括一個默認線程。

此線程運行 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!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM