thread::join()是個簡單暴力的方法,主線程等待子程序期間什麼都不能做,一般情形是主線程建立thread object後做自己的工作而不是簡單停留在join上。thread::join()還會清理子執行緒相關的記憶體空間,此後thread object將不再和這個子執行緒相關了,即thread object不再joinable了,所以join對於乙個子執行緒來說只可以被呼叫一次,為了實現更精細的執行緒等待機制,可以使用條件變數等機制。
異常環境下join,假設主線程在乙個函式f()裡面建立thread object,接著f()又呼叫其它函式g(),那麼確保在g()以任何方式下退出主線程都能join子執行緒。如:若g()通過異常退出,那麼f()需要捕捉異常後join
#include
#include
void do_something(int& i)
class func
void operator() ()
public:
int& i_;
};void do_something_in_current_thread(){}
void f()
catch(...)
t.join();
}int main()
上面的方法看起來笨重,有個解決辦法是採用raii(資源獲取即初始化),將乙個thread object通過棧物件a管理,在棧物件a析構時呼叫thread::join.按照區域性物件析構是構造的逆序,棧物件a析構完成後再析構thread object。如下:
#include
#include
#include
using namespace std;
class thread_guard:boost::noncopyable
~thread_guard()
}//thread_guard(const thread_guard&)=delete;//c++11中這樣宣告表示禁用copy constructor需要-std=c++0x支援,這裡採用boost::noncopyable已經禁止了拷貝和複製
//thread_guard& operator=(const thread_guard&)=delete;
private:
boost::thread& t_;
};void do_something(int& i)
class func
void operator()()
public:
int& i_;
};void do_something_in_current_thread(){}
void fun()
int main()
說明:禁止拷貝和複製的原因是防止棧物件thread_guard在超出了thread object物件生命期的地方使用。如果detach乙個執行緒則沒有上述這麼麻煩,必經detach後就不管子執行緒了。
併發程式設計實戰筆記 第2章
1 無狀態的物件一定是執行緒安全的。2 不恰當的執行時序,出現不正確的結果,定義為競態條件。3 單狀態變數,使用原子型別 4 多狀態變數互動,使用synchronzied,包括2部分,1 要鎖定的物件 2 要保護的 塊。被保護的 塊,操作可看成乙個事務。5 內建鎖是可重入的,也就是自己去獲取自己已經...
C 併發程式設計實戰 閱讀筆記
1.當把函式物件傳入到執行緒建構函式中時,需要避免 最令人頭痛的語法解析 如果傳遞了乙個臨時變數,而不是乙個命名的變數 c 編譯器會將其解析為函式宣告,而不是型別物件的定義。例如 class background task background task f std thread my thread...
C 併發實戰 (一)併發基本概念
併發,最簡單的理解就是,兩個或者以上的活動同時進行。舉個比較實際的例子,你可以手腳並用,兩隻手做不同的動作等等。在計算機中的 併發 是指乙個系統可以同時執行多個獨立的活動。在以前大多數計算機都只有乙個處理單元 或者核心 這種計算機在同一時刻只能執行乙個任務,任務只能乙個乙個的執行,但是這樣的計算機可...