unique_lock独占的是mutex对象,就是对mutex锁的独占。用法如下:
(1)新建一个unique_lock 对象
(2)给对象传入一个std::mutex 对象作为参数;
std::mutex mymutex;unique_lock lock(mymutex);
加锁时新建一个对象lock,而这个对象生命周期完结后主动解锁。在函数外部创立一个锁,函数完结即主动开释
unique_lock成员办法
- lock()
加锁 - unlock()
解锁 - try_lock()
尝试给互斥量加锁,如果拿不到锁,返回false,如果拿到了锁,返回true,这个函数是不阻塞的; - release()
返回它所治理的mutex对象指针,并开释所有权;也就是说,这个unique_lock和mutex不再有关系。严格辨别unlock()与release()的区别,不要混同。
unique_lock所有权的传递
std::unique_lock<std::mutex> lock(mtx);//所有权概念
lock领有mtx的所有权;lock能够把本人对mutex(mtx)的所有权转移给其余的unique_lock对象;
unique_lock对象这个mutex的所有权是能够转移,然而不能复制。
std::mutex mtx;std::unique_lock<std::mutex> move_unique_lock(){ std::unique_lock<std::mutex> tmpguard(mtx); return tmpguard;//从函数中返回一个部分的unique_lock对象是能够的。挪动构造函数。 //返回这种举报对象tmpguard会导致系统生成长期unique_lock对象,并调用unique_lock的挪动构造函数}int main(){ std::mutex mtx; std::unique_lock<std::mutex> lock(mtx);//所有权概念 std::unique_lock<std::mutex> lock1(lock);//此句是非法的,复制所有权是非法的 std::unique_lock<std::mutex> lock2(std::move(lock));//挪动语义,当初先当与lock2与mtx绑定到一起.当初lock指向空,lock2指向了mtx std::unique_lock<std::mutex> lock3 = move_unique_lock();}