声明的含义是什么? '当前线程拥有m'的独占锁

时间:2014-08-14 19:32:43

标签: multithreading boost

有人可以解释一下我的声明(在前置条件下)在下面的文字中的含义以及它在穿线中的意义吗?

此文字位于boost threading tutorial page

unique_lock(Lockable & m,boost::adopt_lock_t)


Precondition:
**The current thread owns an exclusive lock on m.**

Effects:
**Stores a reference to m. Takes ownership of the lock state of m.**

Postcondition:
owns_lock() returns true. mutex() returns &m.

Throws:
Nothing.

2 个答案:

答案 0 :(得分:2)

pre(before)条件:在调用函数之前必须为true的条件。

在这种情况下,可锁定对象" m"必须已被当前线程锁定

这个特殊的构造函数采用的是锁。它取决于其他所有者的所有权。 unique_lock对象将在销毁时解锁Lockable。

答案 1 :(得分:1)

你的问题实际上是关于Boost" unique_lock()"的语义。

这是一个很好的解释:

  

boost::unique_lock vs boost::lock_guard

     

目前最好的投票答案是好的,但它没有澄清我的   怀疑直到我挖得更深,所以决定与那些人分享   可能在同一条船上。

     

首先,lock_guard和unique_lock都遵循RAII模式   最简单的用例是在施工期间获得锁   在自动销毁期间解锁。如果那是你的用例   然后你不需要unique_lock和的额外灵活性   lock_guard会更有效率。

     

两者之间的关键区别是unique_lock实例并不需要   在lock_guard中,始终拥有与之关联的互斥锁   拥有互斥锁。这意味着unique_lock需要额外的   指示它是否拥有锁和另一种额外方法的标志   ' owns_lock()'检查一下。了解这一点,我们可以解释所有额外的   这个标志带来的好处是带来额外数据的开销   设置并检查 -

     

1)锁定不必在构造中正确使用,您可以在构造期间传递标志std :: defer_lock以保持互斥锁   在施工期间解锁。

     

2)我们可以在函数结束之前将其解锁,并且不必等待析构函数释放它,这可能很方便。

     

3)你可以从一个函数传递锁的所有权,它是可移动的而不是可复制的。

     

4)它可以与条件变量一起使用,因为它需要锁定互斥锁,在等待条件时检查和解锁   条件。