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