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析构时解锁
    }
};  }
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号