美文网首页
c++中lock_guard以及unique_lock的区别

c++中lock_guard以及unique_lock的区别

作者: crazyhank | 来源:发表于2021-07-04 11:24 被阅读0次

    这两种锁都可以对std::mutex进行封装,实现RAII的效果。绝大多数情况下这两种锁是可以互相替代的,区别是unique_lock比lock_guard能提供更多的功能特性(但需要付出性能的一些代价),如下:

    • unique_lock可以实现延时锁,即先生成unique_lock对象,然后在有需要的地方调用lock函数,lock_guard在对象创建时就自动进行lock操作了;
    • unique_lock可以在需要的地方调用unlock操作,而lock_guard只能在其对象生命周期结束后自动Unlock;
      正是由于这两个差异特性,unique_lock可以用于一次性锁多个锁以及用于条件变量的搭配使用,而lock_guard做不到。

    通过unique_lock锁多个锁:

    std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
    std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
    std::lock(lk1, lk2);

    通过unique_lock与条件变量一起使用:

    std::condition_variable cvar;
    std::mutex mmutex;
    std::unique_lock<std::mutex> lock(mmutex);

    等待线程:

    cvar.wait(lock, [&, this]() mutable throw() -> bool{ return this->isReady(); });

    唤醒线程:

    std::lock_guard<std::mutex> guard(mmutex);
    flag = true;
    std::cout<<"Data is ready"<<std::endl;
    cvar.notify_one();

    相关文章

      网友评论

          本文标题:c++中lock_guard以及unique_lock的区别

          本文链接:https://www.haomeiwen.com/subject/ufpmultx.html