boost thread學習
Boost thread基礎學習
1、boost thread介紹
thread庫為c++增加了現成處理能力,它提供簡明清晰的執行緒、互斥量等概念,可以很容易地建立多執行緒程式。thread庫也是高度可移植的,它支援最廣泛的windows和POSIX執行緒。
2、使用thread庫
thread位於名稱空間boost,為了使用thread組建需要包含標頭檔案
<boost/thread.hpp>
2.1、時間功能
在多執行緒程式設計時經常要用到超時處理,需要使用時間的概念。thread直接使用的是boost裡面的data_time庫提供對時間的支援可以使用millisec/milliseconds、microsec/microsecond等時間長度類表示超時時間,或者用ptime表示某個確定的時間點。例如
this_thread::sleep(posix_time::seconds(5));//睡眠5s
為了更好的表示時間執行緒的含義,thread重新定義了一個新的時間型別system_time, 它跟posix_time::ptime一樣
typedef boost::posix_time::ptime system_time;
同時thread提供一個自由函式get_system_time(),它抵用microsec_clock類方便地獲取當前的URC時間值。
2.2、互斥量
互斥量是一種用於多執行緒同步的手段,它可以在多執行緒程式設計中防止多個執行緒同時操作共享資源,一旦一個執行緒鎖住互斥量,其他執行緒必須等它解鎖之後才能進行訪問。
thread有七種(實際5種)互斥量型別,分別是
- mutex:獨佔式的互斥量,最簡單最常用的一種互斥量型別;
- try_mutex:它是mutex的同義詞,為了相容以前的版本;
- timed_mutex:它是獨佔式互斥量,但是它特工超時鎖定功能;
- recursive_mutex:遞迴式互斥量,可以多次鎖定,相應得要多次解鎖;
- recrusive_try_mutex:看意思,相容以前版本
- recursive_time_mutex:基本功能與recursive_mutex一致,但是提供超時鎖定功能;
- shared_mutex:multiple-reader/single-writer型共享互斥量(讀寫鎖)。
互斥量的用法:
mutex mu;
try{
mu.lock();//鎖定互斥量
//臨界區操作
mu.unlock();//解鎖互斥量
}
catch(...){
mu.unlock();
}
直接使用mutex的成員函式來鎖定互斥量不夠方便,而且在發生異常導致退出作用域等情況下可能忘記解鎖;因此thread提供了一系列的RAII型的lock_guard類,由於輔助鎖定互斥量,他們在構造的時候鎖定互斥量,析構的時候自動解鎖,從而保證互斥量的正確操作。
mutex類使用內部定義scoped_lock和scoped_try_lock定義兩種lock_guard物件,分別執行lock() 和try_lock()。使用這類可以避免上面try_catch的麻煩。上面的程式碼改為:
mutex mu;
mutex::scoped_lock lock(mu);
//臨界區操作