有人可以解释一下我的声明(在前置条件下)在下面的文字中的含义以及它在穿线中的意义吗?
此文字位于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.
答案 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)它可以与条件变量一起使用,因为它需要锁定互斥锁,在等待条件时检查和解锁 条件。