Mutex 類
Mutex 是 C++11 中最基本的互斥量。Mutex 有兩個常用的方法: 上鎖操作 lock(),和解鎖操作 unlock()。
文件 exp4_1.cc。 編譯命令: g++ exp4_1.cc –o exp4_1–std=c++11 -lpthread 執行 ./exp4_1
在代碼中,m 是一個全局變量,由各線程共享。m 是一把鎖,上鎖和解鎖之間的代碼
是臨界區。鎖保證了如果一個線程正在執行臨界區的代碼,其它線程就必須等待。
atomic
C++中的 std::atomic 對 int, char, bool 等數據結構進行原子性封裝,在多線程環境中, 對std::atomic對象的訪問不會造成競爭-冒險。利用std::atomic可實現數據結構的無鎖設計
lock_guard
- mutex類的lock和unlock方法成對使用,保證了lock和unlock之間的代碼是臨界區。但是,
若在臨界區出現異常,會導致線程阻塞,沒有釋放鎖,導致其他線程也進不了臨界區。
- lock_guard用來管理鎖。某個 lock_guard 對象的聲明周期內,它所管理的鎖對象會 一直保持上鎖狀態;而 lock_guard 的生命周期結束之后,它所管理的鎖對象會被解鎖。 這功能類似智能指針。請看例程
while 循環{}內定義了一個變量 guard,如藍框所示。guard 是 std 標准庫提 供的 lock_guard<mutex>模板類型。guard 用來管理鎖 m, m 是全局變量,是各線程共享的鎖。
- 在 guard 創建時,自動執行了上鎖操作,即 m.lock();
- 在 guard 的生存期結束前,即 while 的}前,自動解鎖,即 m.unlock();
C++11 還提供了一個托管鎖的模板類型 unique_lock。與 lock_guard 相似,unique_lock 也用來管理鎖。lock_guard 只有在生存期開始時上鎖、生存期結束前解鎖。unique_lock 提供 更靈活的上鎖和解鎖機制。unique_lock 有 unlock()方法,可以在 unique_lock 生存期內解鎖。