簡體   English   中英

為什么unique_lock在沒有互斥鎖時會調用解鎖?

[英]Why unique_lock call unlock, when he does not owning mutex?

在此示例中,使用標志std :: defer_lock調用std :: unique_lock。 在cppreference上寫道:“defer_lock_t不獲取互斥鎖的所有權”和:“(析構函數)解鎖相關的互斥鎖,如果擁有”

現在,這個問題!

為什么在這個例子中,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
}

?????

因為std::defer_lock用於說“我稍后會以某種方式獲取鎖定”,這對std::lock(lock1, lock2)的調用就是這樣。 因此,鎖在析構函數中調用unlock。 要測試它,你可以嘗試直接將互斥鎖給std::lockstd::lock(from.m, to.m); 如果這樣做, unique_lock將不會解鎖互斥鎖,因為它們不擁有互斥鎖。

還有std::adopt_lock ,它說“我已經擁有了鎖”。

這兩種方法大多是等價的,除了你不能將std::defer_lockstd::lock_guard ,因為它沒有lock方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM