在 const 函数中使用 boost::mutex::scoped_lock

Using boost::mutex::scoped_lock inside const function

此代码无法编译:

    class MyClass
    {
        boost::mutex _mutex; 

        void foo() const
        {
          boost::mutex::scoped_lock lock(_mutex);
         //critical section
        }
    }

但是将函数定义为非 const 可以正常工作。 拜托,有人可以解释为什么吗? 谢谢!

您不能在 const 成员函数中锁定互斥锁,因为这实际上会修改互斥锁的内部状态(lock 本身不是 const 函数)。

如果你想保留函数 const,你必须将互斥量声明为 mutable,这是一个允许 const 函数修改它的 cv 限定符,即

//can now be locked (i.e. modified) by a const function
mutable boost::mutex _mutex;

使用 mutable 放宽对使用此限定符声明的成员变量的 const 约束,这是绕过常量性的一种方法,因此请注意不要滥用它。在这种情况下,这似乎是合理的,因为互斥锁是您 class 的内部工具,并且不参与 "logical constness"(与 "bitwise constness" 相对)。

这段代码应该可以编译

class MyClass
{
    mutable boost::mutex _mutex; 
    void foo() const
    {
       boost::mutex::scoped_lock lock(_mutex);
       //critical section
    }
}

Raistmaj 是对的。

原因是常量方法保证它不会改变它的 class 实例。通过声明互斥量可变,您为该变量创建了一个例外。

问题的发生是因为 boost::mutex::scoped_lock 的构造函数调用的 boost::mutex::lock() 不是 const 成员函数。由于互斥量是 MyClass 的成员,这意味着 MyClass::_mutex::lock() 不能从 MyClass.

的非 const 成员函数调用

解决方案是将互斥量声明为 mutable 成员。这向编译器表明 _mutex 可能会被修改,即使在 const 成员函数中也是如此:

class MyClass
{
    mutable boost::mutex _mutex; 

    void foo() const
    {
      boost::mutex::scoped_lock lock(_mutex);
     //critical section
    }
}

Please can you explain why it didn't work. Is locking the _mutex is 'modifing' it?

准确地说,_mutex 对象会将其内部状态从 "unlocked" 更改为 "locked" 状态。因此,您需要为常量函数使用 mutable 关键字来保留函数的逻辑常量性,同时允许互斥锁可修改。