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析构时解锁
    }
};  }
posted @ 2023-01-01 15:57  WuYunTaXue  阅读(389)  评论(0编辑  收藏  举报