在 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 关键字来保留函数的逻辑常量性,同时允许互斥锁可修改。
此代码无法编译:
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 关键字来保留函数的逻辑常量性,同时允许互斥锁可修改。