使用mutex时,如果加锁后忘记解锁,或者在使用的过程中出现异常,而没有在异常处理中解锁,那么锁会一直处于加锁状态,而无法解锁。
lock_guard类通过在对象构造的时候对mutux进行加锁,当对象离开作用域时自动解锁,从而避免加锁后没有解锁的问题:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int g_d{0};
void tFunc(mutex& m)
{
for(int i = 0; i < 1000000; ++i)
{
lock_guard<mutex> l(m); //对象构造时直接对mutex加锁,对象离开作用域析构时自动对mutex解锁
g_d++;
}
}
int main(){
mutex m;
thread t1(tFunc, ref(m));
thread t2(tFunc, ref(m));
t1.join();
t2.join();
cout<<g_d<<endl;
return 0;
}
lock_guard的构造函数:explicit lock_guard (mutex_type& m);
可见lock_guard对象构造时,是通过引用到mutex对象,从而完成对mutex对象的加锁及解锁。
但是lock_guard不能在中途解锁,只能通过析构时解锁。
同时lock_guard对象不能被拷贝和移动。