实现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];
注意:release并没有给mutex解锁,以下不安全使用release函数会导致死锁;
#include<iostream>
#include<thread>
#include<mutex>
std::mutex mtx;
void fun1() {
std::lock_guard<std::mutex> lock_g(mtx);
std::cout << "get lock" << std::endl;
}
int main() {
std::unique_lock<std::mutex> 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,作用是告诉构造函数,请尝试获取锁的所有权;