我正在阅读关于互斥锁的this文章。它说明了
lock_guard和unique_lock之间的最大区别在于 lock_guard始终拥有引用的互斥锁的锁定模式 unique_lock没有。实际上,unique_lock甚至可能不会引用a 互斥。
到目前为止,我只能理解当我们需要构造一个锁而不是锁定互斥锁时,我们可以使用std::unique_lock
。它是std::lock_guard
的改进版本除此之外我没有看到太多差异。如果有人可以解释拥有引用的互斥锁的锁模式是什么意思,我将不胜感激。
答案 0 :(得分:1)
使用std::unique_lock
时,可以在构造函数中指定选项。
http://en.cppreference.com/w/cpp/thread/unique_lock/unique_lock
有三个选项std::defer_lock_t
,std::try_lock_t
和std::adopt_lock_t
。
std::defer_lock_t
不锁定关联的互斥锁。
std::try_lock_t
尝试通过调用m.try_lock()
来锁定关联的互斥锁而不会阻塞。如果当前线程已经拥有互斥锁,除非互斥锁是递归的,否则行为是未定义的。
std::adopt_lock_t
假设调用线程已经拥有m。
如果未指定任何选项(即仅使用互斥锁参数调用构造函数) - 只使用mutex.lock()
函数锁定互斥锁。
当您使用std::lock_guard
时,您只能指定一个选项(std::adopt_lock_t
),在其他情况下,互斥锁将被lock
函数锁定。
在所有这些情况下,如果lock_guard
被锁定,unique_lock
/ mutex.unlock()
mutex的析构函数将通过调用mutex
函数解锁。