您好,登錄后才能下訂單哦!
boost::mutex提供了跨平臺的鎖操作,不允許多個線程同時訪問共享資源,從而確保共享資源不被臟寫。在本文中僅僅是介紹簡單的兩種鎖,最高效的鎖boost::mutex和區(qū)域鎖boost::mutex::scoped_lock
boost::mutex例子
#include <boost/thread/mutex.hpp>
boost::mutex m_mutexAccessServiceManager;
void CSettingCenter::ClearPlatformServiceInfoCache()
{
m_mutexAccessServiceManager.lock();
m_mapAccessServiceManager.clear();
m_mutexAccessServiceManager.unlock();
}
區(qū)域鎖boost::mutex::scoped_lock顧名思義就是在作用域內(nèi)有效,當(dāng)離開作用域自動釋放鎖,傳遞參數(shù)是鎖。區(qū)域鎖就是把鎖封裝到一個對象里面。鎖的初始化放到構(gòu)造函數(shù),鎖的釋放放到析構(gòu)函數(shù)。這樣當(dāng)鎖離開作用域時,
析構(gòu)函數(shù)會自動釋放鎖。即使運行時拋出異常,由于析構(gòu)函數(shù)仍然會自動運行,所以鎖仍然能自動釋放。一個典型的區(qū)域鎖
void test()
{
boost::mutex::scoped_lock lock(m_mutexAccessServiceManager);
m_mapAccessServiceManager.clear();
}
應(yīng)用于有大量的return返回的代碼,避免出現(xiàn)死鎖的問題
擴展
std::scoped_lock提供了可變參數(shù)長度的構(gòu)造器,接收多個鎖。允許在可能導(dǎo)致死鎖的狀態(tài)下,對多個互斥量加鎖。例如:
{
??? // safely locked as if using std::lock
??? std::scoped_lock<std::mutex, std::mutex> lock(mutex1, mutex2);????
}
目前std::lock_guard已經(jīng)被廢棄,GCC7已經(jīng)完整支持
friend void swap(X& lhs, X& rhs)
{
??? if (&lhs == & rhs)
??????? return;
??? std::lock(lhs.m, rhs.m);
??? std::lock_guard<std::mutex> lock_a(lhs.m, std::adopt_lock);
??? std::lock_guard<std::mutex> lock_b(rhs.m, std::adopt_lock);
??? swap(lhs.some_detail, rhs.some_detail);
}
friend void swap(X& lhs, X& rhs)
{
??? if (&lhs == &rhs)
??????? return;
??? std::scoped_lock guard(lhs.m, rhs.m);
??? swap(lhs.some_detail, rhs.some_detail);
}
引用
https://stackoverflow.com/questions/43019598/stdlock-guard-or-stdscoped-lock
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。