1

我正在阅读这篇关于互斥锁的文章。它指出

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

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

4

1 回答 1

1

使用std::unique_lock时可以在构造函数中指定选项。

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

共有三个选项std::defer_lock_t和。 不锁定关联的互斥锁。std::try_lock_tstd::adopt_lock_tstd::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_lockmutex 的析构函数将通过调用mutex.unlock()函数解锁,如果mutex被锁定。

于 2013-10-17T19:30:44.343 回答