【问题标题】:what the statement means? 'The current thread owns an exclusive lock on m'声明是什么意思? '当前线程拥有 m 的排他锁'
【发布时间】:2014-08-14 19:32:43
【问题描述】:

谁能解释一下下面文本中的语句(在先决条件下)的含义以及它在线程中的意义?

此文本可在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.

【问题讨论】:

    标签: multithreading boost


    【解决方案1】:

    前置(之前)条件:在调用函数之前必须为真的条件。

    在这种情况下,Lockable 对象“m”必须已经被当前线程锁定

    这个特定的构造函数所做的是采用锁。它从另一个所有者手中夺走了它的所有权。 unique_lock 对象会在 Lockable 被销毁时解锁。

    【讨论】:

    • @JonathanWakely:已更新。
    【解决方案2】:

    您的问题实际上是关于 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) 它可以与条件变量一起使用,因为这需要锁定互斥锁、条件检查和解锁,同时等待 条件。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2014-09-20
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多