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