動態

詳情 返回 返回

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<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();
}

Add a new 評論

Some HTML is okay.