C++11中std::unique 您所在的位置:网站首页 lockonlock C++11中std::unique

C++11中std::unique

#C++11中std::unique| 来源: 网络整理| 查看: 265

std::unique_lock为锁管理模板类,是对通用mutex的封装。std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即在unique_lock对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而unique_lock的生命周期结束之后,它所管理的锁对象会被解锁。unique_lock具有lock_guard的所有功能,而且更为灵活。虽然二者的对象都不能复制,但是unique_lock可以移动(movable),因此用unique_lock管理互斥对象,可以作为函数的返回值,也可以放到STL的容器中。

关于std::mutex的基础介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/73521630  

std::unique_lock还支持同时锁定多个mutex,这避免了多道加锁时的资源”死锁”问题。在使用std::condition_variable时需要使用std::unique_lock而不应该使用std::lock_guard。

std::unique_lock类成员函数介绍:

(1). unique_lock构造函数:禁止拷贝构造,允许移动构造;

(2). operator =:赋值操作符,允许移动赋值,禁止拷贝赋值;

(3). operator bool:返回当前std::unique_lock对象是否获得了锁;

(4). lock函数:调用所管理的mutex对象的lock函数;

(5). try_lock函数:调用所管理的mutex对象的try_lock函数;

(6).try_lock_for函数:调用所管理的mutex对象的try_lock_for函数;

(7).try_lock_until函数:调用所管理的mutex对象的try_lock_until函数;

(8). unlock函数:调用所管理的mutex对象的unlock函数;

(9). release函数:返回所管理的mutex对象的指针,并释放所有权,但不改变mutex对象的状态;

(10). owns_lock函数:返回当前std::unique_lock对象是否获得了锁;

(11). mutex函数:返回当前std::unique_lock对象所管理的mutex对象的指针;

(12). swap函数:交换两个unique_lock对象。

The difference is that you can lock and unlock a std::unique_lock. std::lock_guard will be locked only once on construction and unlocked on destruction.

std::unique_lock has other features that allow it to e.g.: be constructed without locking the mutex immediately but to build the RAII wrapper. However, std::unique_lock might have a tad more overhead(较多开销).

std::lock_guard also provides a convenient RAII wrapper, but cannot lock multiple mutexes safely. It can be used when you need a wrapper for a limited scope, e.g.: a member function.

One of the differences between std::lock_guard and std::unique_lock is that the programmer is able to unlock std::unique_lock, but she/he is not able to unlock std::lock_guard.

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

#include "unique_lock.hpp" #include #include #include #include #include namespace unique_lock_ { // // reference: http://www.cplusplus.com/reference/mutex/unique_lock/unique_lock/ namespace { std::mutex foo, bar; void task_a() { std::lock(foo, bar); // simultaneous lock (prevents deadlock) std::unique_lock lck1(foo, std::adopt_lock); std::unique_lock lck2(bar, std::adopt_lock); std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有