lock_guard总是拥有引用的互斥锁的锁模式意味着什么?

时间:2013-10-17 19:13:32

标签: c++ multithreading thread-safety mutex c++98

我正在阅读关于互斥锁的this文章。它说明了

  

lock_guard和unique_lock之间的最大区别在于   lock_guard始终拥有引用的互斥锁的锁定模式   unique_lock没有。实际上,unique_lock甚至可能不会引用a   互斥。

到目前为止,我只能理解当我们需要构造一个锁而不是锁定互斥锁时,我们可以使用std::unique_lock。它是std::lock_guard的改进版本除此之外我没有看到太多差异。如果有人可以解释拥有引用的互斥锁的锁模式是什么意思,我将不胜感激。

1 个答案:

答案 0 :(得分: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.lock()函数锁定互斥锁。

当您使用std::lock_guard时,您只能指定一个选项(std::adopt_lock_t),在其他情况下,互斥锁将被lock函数锁定。

在所有这些情况下,如果lock_guard被锁定,unique_lock / mutex.unlock() mutex的析构函数将通过调用mutex函数解锁。