鎖,mutex互斥量,atomic原子操作,lock_guard


 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 生存期內解鎖。 


免責聲明!

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



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