OpenThreads庫是一個輕量級的跨平台多線程庫,在2.x之前是獨立發展的一個庫,在2.x後併入到OSG的源碼中,OSG中大量的多線程操作都是基於這個庫編寫的。(事實上使用該庫是曆史原因的問題,在OSG創立的時候,C++標準中並沒有C++11引入的線程庫),庫的詳細介紹參考:OpenThreads網站 Thread線程
線程實作類別。它是一個物件導向的線程實現介面,每定義一個Thread 類,就相當於定義了一個共用進程資源,但是可以獨立調度的線程。通過重寫run()和cancel()這兩個成員函數,即可實現線程運行時和取消時的操作;通過調用start()和cancel(),可以啟動或中止已經定義的進程對象。 1. 線程的使用
OpenThread的Thread類是一個純虛類,需要子類重寫run方法,提供線程啟動並執行函數入口地址,例如
class MyThread : public OpenThreads::Thread{public: MyThread(){} ~MyThread(){} virtual void run() { for (int i = 0; i < 10; ++i) { std::cout << "My Thread Running" << std::endl; } }};
線程在產生之後,可以使用join和detach到建立它的線程,如果使用join的方式,那麼建立它的線程必須等待直到這個線程完成,如果是detach的方式,那麼建立線程的線程和被建立的線程二者之間沒有任何關係,被建立的線程相當於完全獨立出來了。在OpenThread中預設使用的就是detach的模式。 detach方式
int main(){ MyThread thread; thread.start(); for (int i = 0; i < 10; ++i) { std::cout << "Main Thread Running" << std::endl; } OpenThreads::Thread::microSleep(1500000);
輸出
join方式
int main(){ MyThread thread; thread.start(); thread.join(); for (int i = 0; i < 10; ++i) { std::cout << "Main Thread Running" << std::endl; } OpenThreads::Thread::microSleep(1500000);}
輸出
可以看到二者的輸出不同,join方式中主線程會等待MyThread線程執行完成之後才開始繼續執行,關於join和detach可以參考:線程的join 和detach狀態(線程的分離與結合) 2. 其他函數
在Thread類中還有兩個比較常用的函數,都是靜態函數。
static int YieldCurrentThread();
掛起當前執行的線程
static int microSleep(unsigned int microsec);
使得當前線程進入睡眠
兩者可以讓當前的線程停止執行,轉而讓進程處理其他線程的工作。 參考資料
1.線程的join 和detach狀態(線程的分離與結合)
2.OpenThreads庫的使用-Thread