2013-10-17 31 views
0

我正在閱讀this關於互斥體的文章。它指出lock_guard總是擁有引用互斥鎖意味着的鎖定模式?

lock_guard和unique_lock之間最大的區別是, lock_guard始終擁有引用互斥的鎖定模式和 unique_lock沒有。的確,unique_lock甚至可能不會引用一個 互斥量。

到目前爲止我只理解當我們需要構造一個鎖而不鎖定互斥鎖時,我們可以使用std::unique_lock。它是std::lock_guard的改進版本除此之外,我沒有看到太多的區別。如果有人能夠解釋擁有引用互斥鎖模式的含義,我將不勝感激。

回答

1

當您使用std::unique_lock時,您可以在構造函數中指定選項。

http://en.cppreference.com/w/cpp/thread/unique_lock/unique_lock

有三個選項std::defer_lock_tstd::try_lock_tstd::adopt_lock_tstd::defer_lock_t不鎖定關聯的互斥鎖。

std::try_lock_t嘗試通過調用m.try_lock()來鎖定關聯的互斥鎖而不進行阻止。如果當前線程已經擁有互斥鎖,除非互斥鎖是遞歸的,否則行爲是未定義的。

std::adopt_lock_t假設調用線程已經擁有m。

如果沒有指定任何選項(即只用mutex參數調用構造函數) - 互斥鎖只是用mutex.lock()函數鎖定。

當您使用std::lock_guard時,您只能指定一個選項(std::adopt_lock_t),在其他情況下,互斥鎖將被鎖定爲lock函數。

在這一切的情況下,在lock_guard/unique_lock互斥的析構函數將調用解鎖以mutex.unlock()功能,如果mutex被鎖定。