【问题标题】: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_tstd::try_lock_tstd::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 被锁定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 2011-04-13
      相关资源
      最近更新 更多