C++11中std::mutex的使用

C++11中新增了<mutex>,它是C++標準程序庫中的一個頭文件,定義了C++11標準中的一些互斥訪問的類與方法等。其中std::mutex就是lock、unlock。std::lock_guard與std::mutex配合使用,把鎖放到lock_guard中時,mutex自動上鎖,lock_guard析構時,同時把mutex解鎖。mutex又稱互斥量。

C++11標準庫定義了4個互斥類:

(1)、std::mutex:該類表示普通的互斥鎖, 不能遞歸使用。

(2)、std::timed_mutex:該類表示定時互斥鎖,不能遞歸使用。std::time_mutex比std::mutex多了兩個成員函數:

A、try_lock_for():函數參數表示一個時間範圍,在這一段時間範圍之內線程如果沒有獲得鎖則保持阻塞;如果在此期間其他線程釋放了鎖,則該線程可獲得該互斥鎖;如果超時(指定時間範圍內沒有獲得鎖),則函數調用返回false。

B、try_lock_until():函數參數表示一個時刻,在這一時刻之前線程如果沒有獲得鎖則保持阻塞;如果在此時刻前其他線程釋放了鎖,則該線程可獲得該互斥鎖;如果超過指定時刻沒有獲得鎖,則函數調用返回false。

(3)、std::recursive_mutex:該類表示遞歸互斥鎖。遞歸互斥鎖可以被同一個線程多次加鎖,以獲得對互斥鎖對象的多層所有權。例如,同一個線程多個函數訪問臨界區時都可以各自加鎖,執行後各自解鎖。std::recursive_mutex釋放互斥量時需要調用與該鎖層次深度相同次數的unlock(),即lock()次數和unlock()次數相同。可見,線程申請遞歸互斥鎖時,如果該遞歸互斥鎖已經被當前調用線程鎖住,則不會產生死鎖。此外,std::recursive_mutex的功能與 std::mutex大致相同。

(4)、std::recursive_timed_mutex:帶定時的遞歸互斥鎖。

互斥類的最重要成員函數是lock()和unlock()。在進入臨界區時,執行lock()加鎖操作,如果這時已經被其它線程鎖住,則當前線程在此排隊等待。退出臨界區時,執行unlock()解鎖操作。

用於互斥鎖的RAII的類模板:更好的辦法是採用”資源分配時初始化”(RAII)方法來加鎖、解鎖,這避免了在臨界區中因爲拋出異常或return等操作導致沒有解鎖就退出的問題。極大地簡化了程序員編寫Mutex相關的異常處理代碼。C++11的標準庫中提供了std::lock_guard類模板做mutex的RAII。

std::mutex類是一個同步原語,可用於保護共享數據被同時由多個線程訪問。std::mutex提供獨特的,非遞歸的所有權語義。

        std::mutex是C++11中最基本的互斥量,std::mutex對象提供了獨佔所有權的特性,不支持遞歸地對std::mutex對象上鎖。

        std::mutex成員函數:

        (1)、構造函數:std::mutex不支持copy和move操作,最初的std::mutex對象是處於unlocked狀態。

        (2)、lock函數:互斥鎖被鎖定。線程申請該互斥鎖,如果未能獲得該互斥鎖,則調用線程將阻塞(block)在該互斥鎖上;如果成功獲得該互訴鎖,該線程一直擁有該互斥鎖直到調用unlock解鎖;如果該互斥鎖已經被當前調用線程鎖住,則產生死鎖(deadlock)。

        (3)、unlock函數:解鎖,釋放調用線程對該互斥鎖的所有權。

        (4)、try_lock:嘗試鎖定互斥鎖。如果互斥鎖被其他線程佔有,則當前調用線程也不會被阻塞,而是由該函數調用返回false;如果該互斥鎖已經被當前調用線程鎖住,則會產生死鎖。其中std::mutex就是lock、unlock。std::lock_guard與std::mutex配合使用,把鎖放到lock_guard中時,mutex自動上鎖,lock_guard析構時,同時把mutex解鎖。

         (5)、native_handle:返回當前句柄。

         std::mutex: A mutex is a lockable object that is designed to signal when critical sections of code need exclusive access, preventing other threads with the same protection from executing concurrently and access the same memory locations. std::mutex objects provide exclusive ownership and do not support recursivity (i.e., a thread shall not lock a mutex it already owns).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章