C++11 unique_lock lock_guard

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 lock(mtx);//所有权概念

lock拥有mtx的所有权;lock可以把自己对mutex(mtx)的所有权转移给其他的unique_lock对象;

unique_lock对象这个mutex的所有权是可以转移,但是不能复制。

std::mutex mtx;

std::unique_lock move_unique_lock()
{
    std::unique_lock tmpguard(mtx);
    return tmpguard;//从函数中返回一个局部的unique_lock对象是可以的。移动构造函数。
                    //返回这种举报对象tmpguard会导致系统生成临时unique_lock对象,并调用unique_lock的移动构造函数
}

int main()
{
    std::mutex mtx;
    std::unique_lock lock(mtx);//所有权概念

    std::unique_lock lock1(lock);//此句是非法的,复制所有权是非法的


    std::unique_lock lock2(std::move(lock));//移动语义,现在先当与lock2与mtx绑定到一起.现在lock指向空,lock2指向了mtx
    std::unique_lock lock3 = move_unique_lock();
}

你可能感兴趣的:(c++11)