【问题标题】:what does lock_guard always owns the lock mode of the referenced mutex mean?lock_guard 始终拥有所引用互斥锁的锁定模式是什么意思?
【发布时间】:2013-10-17 19:13:32
【问题描述】:
我正在阅读 this 关于互斥锁的文章。它指出
lock_guard 和 unique_lock 最大的区别在于
lock_guard 始终拥有所引用互斥锁的锁定模式,并且
unique_lock 没有。事实上,unique_lock 甚至可能不引用
互斥体。
到目前为止,我只了解当我们需要构造一个锁但不锁定互斥体时,我们可以使用std::unique_lock。它是std::lock_guard的改进版,除此之外我看不出有什么不同。如果有人能解释所引用互斥锁的拥有锁定模式是什么意思,我将不胜感激?
【问题讨论】:
标签:
c++
multithreading
thread-safety
mutex
c++98
【解决方案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 参数调用构造函数) - mutex 仅使用 mutex.lock() 函数锁定。
当您使用std::lock_guard 时,您只能指定一个选项(std::adopt_lock_t),否则互斥锁将被lock 函数锁定。
在所有这些情况下,lock_guard/unique_lock 的析构函数中的互斥锁将通过调用 mutex.unlock() 函数来解锁,如果 mutex 被锁定。