C++ std::lock_guard詳解
01
—
std::lock_guard詳解
std::lock_guard屬于C++11特性,鎖管理遵循RAII習(xí)語管理資源,鎖管理器在構(gòu)造函數(shù)中自動(dòng)綁定它的互斥體并加鎖,在析構(gòu)函數(shù)中解鎖,大大減少了死鎖的風(fēng)險(xiǎn)。下面我們來看一段代碼。
#include?
#include?
#include?
class?Widget{
public:
????Widget() = default;
????~Widget() = default;
????void?fun(){
????????std::lock_guard<std::mutex> lock(lock_);
????????std::cout?<< "Widget::fun run"?<< std::endl;
????}
private:
????std::mutex lock_;
};
void?TestThread1(Widget* w){
????w->fun();
}
int?main()
{
????Widget* w = new?Widget();
????std::thread t1(&TestThread1, w);
????t1.join();
????return?0;
}這是std::lock_gurad最基本的使用,程序在std::lock_guard生命周期內(nèi)加鎖和解鎖,其中加鎖和解鎖分別在構(gòu)造函數(shù)和析構(gòu)函數(shù)中完成,具體如何我們看下std::lock_guard的構(gòu)造函數(shù)和析構(gòu)函數(shù)。
template <class?_Mutex>
class?_LIBCPP_TEMPLATE_VIS?_LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable)
lock_guard
{
public:
????typedef _Mutex mutex_type;
private:
????mutex_type& __m_;
public:
????_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY
????explicit lock_guard(mutex_type& __m)?_LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m))
????????: __m_(__m)?{__m_.lock();}
????_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY
????lock_guard(mutex_type& __m, adopt_lock_t)?_LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m))
????????: __m_(__m)?{}
????_LIBCPP_INLINE_VISIBILITY
????~lock_guard() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability()) {__m_.unlock();}
private:
????lock_guard(lock_guard const&) _LIBCPP_EQUAL_DELETE;
????lock_guard& operator=(lock_guard const&) _LIBCPP_EQUAL_DELETE;
};評(píng)論
圖片
表情
