一、说明
lock_guard用来包装Mutex,实现Mutex的自动锁定和解锁。能保证锁定过程中逻辑异常也能自动解锁。
二、windows下的源码
template<class _Mutex>
class lock_guard<_Mutex>
{
// specialization for a single mutex
public:
typedef _Mutex mutex_type;
explicit lock_guard(_Mutex& _Mtx) //传的是引用
: _MyMutex(_Mtx)
{
// construct and lock
_MyMutex.lock();
}
lock_guard(_Mutex& _Mtx, adopt_lock_t)
: _MyMutex(_Mtx)
{
// construct but don't lock
}
~lock_guard() _NOEXCEPT
{
// unlock
_MyMutex.unlock();
}
lock_guard(const lock_guard&) = delete; //不能拷贝构造
lock_guard& operator=(const lock_guard&) = delete; //不能赋值给其他对象
private:
_Mutex& _MyMutex;
};
三、源码解析
代码很简单,构造函数里调用mutex的lock,析构时调用mutex的unlock。代码抛异常的时候会析构栈上的对象,也就会自动调用mutex的unlock。
四、使用示例
class LockGuardTest
{
private:
mutex _mutex;
int count = 0;
public:
void process()
{
for(int i=0;i<100000;i++)
{
{
MyLockGuard<mutex> guard(_mutex);
count++;
}
}
}
void doTest()
{
thread t1([this]() {
this->process(); });
thread t2([this]() {
this->process(); });
t1.join();
t2.join();
}
};