lock_guard和unique_lock
lock_guard和unique_lock互斥锁
std::mutex是c++基础的互斥锁
为了避免有些场景下忘记unlock导致的死锁,c++11引入了std::unique_lock和std::lock_guard两种数据结构。实现自动unlock的功能。
lock_guard
lock_guard在构造时加锁,析构时解锁
std::mutex mut;
{
std::lock_guard<std::mutex> lck(mut); //加锁
handler_data();
//离开代码块,lck析构时解锁
}
unique_lock
unique_lock和lock_guard都可以实现自动加锁和解锁功能。但unique_lock可以更灵活的管理mutex。
unique_lock提供了unlock、lock\try_lock接口,可以在需要的地方手动解锁
unique_lock可以在初始化构造时选择是否加锁
class tmpa{
private:
std::mutex mut;
std::vector<int> fram;
public:
void insert_data(int dat){
std::unique_lock<std::mutex> lck(mut, std::defer_lock);
//创建一个默认不加锁的unique_lock
lck.lock(); //手动加锁
fram.push_back(dat);
lck.unlock(); //手动解锁
std::cout << "123456" << std::endl;
lck.lock(); //手动加锁
fram.push_back(dat);
//lck析构时,会判断是否需要解锁,需要就执行unlock
}
int pop_data(){
std::unique_lock<std::mutex> lck(mut); //构造时加锁
int res = fram.front();
fram.pop_back();
return res;
//lck析构时解锁
}
}; }