• C++ std::unique_lock,以及处理锁


    实现std::lock_guard能干的活,std::unique_lock都能干,且std::unique_lock的灵活性是比std::lock_guard高的;

    -:因为std::unique_lock重载了lock和unlock方法,它可以作为std::lock的参数;

    -:std::unique_lock的实例不依赖于std::mutex等锁,所以在初始化的时候,他有空构造函数的,即我们可以不传锁进去,当然,这就导致了std::unique_lock的锁有两种状态,即内部有无锁,这个可以通过bool std::unique_lock.owns_lock()来检测;

    -:std::unique_lock可以在运行时自主决策是否放弃锁的所有权,这个是通过

    1. _Mutex *release() noexcept
    2. { // disconnect
    3. _Mutex *_Res = _Pmtx;
    4. _Pmtx = nullptr;
    5. _Owns = false;
    6. return (_Res);
    7. }

    std::mutex* std::unique_lock.release()来实现的,他会自己破坏与锁的关系,且返回锁的指针[当实例不持有锁的时候,返回nullptr];

    注意:release并没有给mutex解锁,以下不安全使用release函数会导致死锁;

    1. #include
    2. #include
    3. #include
    4. std::mutex mtx;
    5. void fun1() {
    6. std::lock_guard lock_g(mtx);
    7. std::cout << "get lock" << std::endl;
    8. }
    9. int main() {
    10. std::unique_lock lock_u(mtx);
    11. std::thread thSon(fun1);
    12. std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    13. std::cout << "release" << std::endl;
    14. lock_u.release();
    15. thSon.join();
    16. std::cin.get();
    17. }

    -:std::unique_lock可以通过std::mutex* std::unique_lock.mutex()来获取内部锁的指针,这个方法,从自觉上看是非常危险的,因为这暴露了std::unique_lock内部的部分,使程序可以在std::unique_lock之外进行对被持有的锁进行操作;

    -:std::unique_lock是可移动且不可拷贝的对象;

    -:std::unique_lock的3个第二参数

            ·:std::defer_lock,作用是告诉构造函数,在构造的时候不要给获取锁的所有权,将会在后续的执行中进行获取。这里的一个应用是用std::lock给std::unique_lock上锁,因为将std::unique_lock传递给std::lock前,前者的锁不能是已经获取的状态

            ·:std::adopt_lock,作用是告诉构造函数,在构造之前,该锁的所有权就已经被获取,请不要尝试获取;

            ·:std::try_to_lock,作用是告诉构造函数,请尝试获取锁的所有权;

  • 相关阅读:
    一道有意思的 CSS 面试题,FizzBu​​zz ~
    windows中运行项目中.sh和kaggle安装与配置
    冥想第六百三十四天
    Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)
    如何利用pynlpir进行中文分词并保留段落信息
    jenkins 部署 vue 项目
    ckplayer播放线上视频问题
    【Spring Cloud Alibaba】开源组件Sentinel
    基于C语言实现的网络传输机制-支持 TCP 可靠数据传输
    PostGreSQL:时间戳时区问题
  • 原文地址:https://blog.csdn.net/weixin_62953519/article/details/127586503