2016-07-23 69 views
0

在這個例子中,std :: unique_lock調用標誌std :: defer_lock。寫在cppreference上:「defer_lock_t不獲取互斥鎖的所有權」 和:「(析構函數)解鎖相關互斥鎖,如果擁有」爲什麼unique_lock電話解鎖,當他不擁有互斥?

現在,問題!

爲什麼在這個例子中,std :: unique_lock在析構函數中調用解鎖?

void transfer(Box &from, Box &to, int num) 
{ 
    // don't actually take the locks yet 
    std::unique_lock<std::mutex> lock1(from.m, std::defer_lock); 
    std::unique_lock<std::mutex> lock2(to.m, std::defer_lock); 

    // lock both unique_locks without deadlock 
    std::lock(lock1, lock2); 

    from.num_things -= num; 
    to.num_things += num; 

    // 'from.m' and 'to.m' mutexes unlocked in 'unique_lock' dtors 
} 

?????

+0

std ::鎖定它的功能。他們返回無效 –

回答

2

因爲std::defer_lock服務說「我會稍後獲得鎖」,其中std::lock(lock1, lock2)的呼叫。因此,鎖在析構函數中調用解鎖。爲了測試這一點,你可以嘗試直接給std::lock互斥對象:std::lock(from.m, to.m);。如果你這樣做,unique_lock不會解鎖互斥,因爲它們不擁有它們。

還有std::adopt_lock,其中說「我已經擁有鎖」。

這兩種方法大部分是等價的,不同的是你不能使用std::defer_lockstd::lock_guard,因爲它沒有lock方法。

相關問題