C++ std::unique_lock 用法實例詳解
unique_lock 對象以獨占所有權(quán)的方式( unique owership)管理 mutex 對象的上鎖和解鎖操作,所謂獨占所有權(quán),就是沒有其他的 unique_lock 對象同時擁有某個 mutex 對象的所有權(quán)。
在構(gòu)造(或移動(move)賦值)時,unique_lock 對象需要傳遞一個 Mutex 對象作為它的參數(shù),新創(chuàng)建的 unique_lock 對象負責傳入的 Mutex 對象的上鎖和解鎖操作。
std::unique_lock 對象也能保證在其自身析構(gòu)時它所管理的 Mutex 對象能夠被正確地解鎖(即使沒有顯式地調(diào)用 unlock 函數(shù))。因此,和 lock_guard 一樣,這也是一種簡單而又安全的上鎖和解鎖方式,尤其是在程序拋出異常后先前已被上鎖的Mutex 對象可以正確進行解鎖操作,極大地簡化了程序員編寫與 Mutex 相關(guān)的異常處理代碼
std::unique_lock 是 C++11 提供的一個用于管理互斥鎖的類,它提供了更靈活的鎖管理功能,適用于各種多線程場景。
1.創(chuàng)建 std::unique_lock 對象
std::unique_lock<std::mutex> lock(mutex); // 創(chuàng)建 std::unique_lock 并關(guān)聯(lián)互斥鎖 mutex
你可以在構(gòu)造函數(shù)中傳入一個互斥鎖(std::mutex 或其它互斥鎖類型)來創(chuàng)建 std::unique_lock 對象,并且會在構(gòu)造時獲取互斥鎖的所有權(quán)。此時,互斥鎖被鎖住,其他線程無法獲得鎖。
2.自動加鎖和解鎖
{ std::unique_lock<std::mutex> lock(mutex); // 自動加鎖 // 臨界區(qū)代碼 } // 自動解鎖
使用 std::unique_lock 創(chuàng)建的對象,當其生命周期結(jié)束時(通常是在大括號的作用域結(jié)束時),會自動解鎖互斥鎖,以確?;コ怄i在不再需要時被釋放。
3.延遲加鎖與手動加解鎖
std::unique_lock 還支持在初始化時不立即加鎖,而是在需要時延遲加鎖。這種特性對于一些多線程場景非常有用,允許你在獲得鎖之前執(zhí)行一些非臨界區(qū)的操作,從而減少鎖的持有時間。
創(chuàng)建 std::unique_lock 對象時,傳入互斥鎖但不加鎖:
std::unique_lock<std::mutex> lock(mutex, std::defer_lock);
在需要時手動加鎖:
lock.lock(); // 手動加鎖 // 臨界區(qū)代碼 lock.unlock(); // 手動解鎖
你可以使用 lock() 手動加鎖互斥鎖,然后在互斥鎖保護的臨界區(qū)內(nèi)執(zhí)行代碼,最后使用 unlock() 手動解鎖互斥鎖。這種方式可以讓你更靈活地控制鎖的生命周期。
4.嘗試加鎖
std::unique_lock 還提供了 try_lock() 方法,用于嘗試加鎖,如果鎖不可用,則返回 false,如果鎖成功獲取,則返回 true。
std::unique_lock<std::mutex> lock(mutex, std::defer_lock); if (lock.try_lock()) { // 鎖成功獲取,執(zhí)行臨界區(qū)代碼 lock.unlock(); } else { // 鎖不可用,執(zhí)行其他邏輯 }
5.條件變量的配合使用
std::unique_lock 經(jīng)常與條件變量(std::condition_variable)一起使用,以實現(xiàn)線程的等待和通知機制。當條件不滿足時,std::unique_lock 可以釋放鎖并等待條件的發(fā)生,一旦條件滿足,它可以重新獲取鎖并繼續(xù)執(zhí)行。
std::unique_lock<std::mutex> lock(mutex); while (!condition) { conditionVariable.wait(lock); // 等待條件滿足并釋放鎖 } // 條件滿足,重新獲取鎖并繼續(xù)執(zhí)行
6.小結(jié)
std::unique_lock 提供了對互斥鎖更高級別的控制和靈活性,使得多線程編程更加安全和容易。在多數(shù)情況下,推薦使用 std::unique_lock 而不是直接操作互斥鎖,因為它能夠自動管理鎖的生命周期,減少了出錯的機會。
參考文獻
到此這篇關(guān)于C++ std::unique_lock 用法介紹的文章就介紹到這了,更多相關(guān)C++ std::unique_lock 用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Matlab實現(xiàn)野狗優(yōu)化算法的示例代碼
野狗優(yōu)化算法(Dingo?Optimization?Algorithm,?DOA)模仿澳大利亞野狗的社交行為。DOA算法的靈感來源于野狗的狩獵策略,即迫害攻擊、分組策略和食腐行為。本文將通過Matlab實現(xiàn)這一算法,感興趣的可以了解一下2022-04-04使用c語言輕松實現(xiàn)動態(tài)內(nèi)存管
這篇文章主要介紹了使用c語言輕松實現(xiàn)動態(tài)內(nèi)存管,本文章內(nèi)容詳細,具有很好的參考價值,希望對大家有所幫助,需要的朋友可以參考下2023-01-01