实现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可以在运行时自主决策是否放弃锁的所有权,这个是通过
- _Mutex *release() noexcept
- { // disconnect
- _Mutex *_Res = _Pmtx;
- _Pmtx = nullptr;
- _Owns = false;
- return (_Res);
- }
std::mutex* std::unique_lock.release()来实现的,他会自己破坏与锁的关系,且返回锁的指针[当实例不持有锁的时候,返回nullptr];
- #include
- #include
- #include
- std::mutex mtx;
- void fun1() {
- std::lock_guard
lock_g(mtx) ; - std::cout << "get lock" << std::endl;
- }
-
- int main() {
- std::unique_lock
lock_u(mtx) ; - std::thread thSon(fun1);
- std::this_thread::sleep_for(std::chrono::milliseconds(1000));
- std::cout << "release" << std::endl;
- lock_u.release();
- thSon.join();
- std::cin.get();
- }
-: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,作用是告诉构造函数,请尝试获取锁的所有权;