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();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。