boost :: recursive_mutex :: scoped_locks析构函数会引用一个未锁定的互斥锁吗?

时间:2011-03-11 10:42:43

标签: c++ boost mutex scoped-lock recursive-mutex

unlock()上调用boost::recursive_mutex::scoped_lock之后,锁定对象会在其析构函数中以某种方式引用互斥锁吗?

在解锁调用后,锁仍然保留对互斥锁的引用(即。mutex()返回相同的指针)。在锁定超出范围之前销毁互斥锁​​的情况下,还必须在锁上调用release()吗?

1 个答案:

答案 0 :(得分:1)

查看Boost 1.42中的unique_lock析构函数的代码:

    ~unique_lock()
    {
        if(owns_lock())
        {
            m->unlock();
        }
    }

如果它拥有锁,它只会尝试取消引用指向你的(现在无效)互斥锁的指针。如果您已经在此scoped_lock上调用了unlock,那么它不应该导致您在此实现中出现问题(尽管不太可能,但在将来的库版本中可能会更改)。

但是,最佳做法是确保按顺序销毁对象,以便在依赖对象之前销毁依赖对象。如果你不能保证这一点,正如你正确地说,你应该在锁定之前调用release(),然后再销毁互斥锁​​。