[英]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-member函数中锁定互斥锁,因为它实际上修改了互斥lock
的内部状态( lock
本身不是const
函数)。
如果你想保持函数const
,你必须将互斥量声明为mutable
,这是一个允许const函数修改它的cv限定符,即
//can now be locked (i.e. modified) by a const function
mutable boost::mutex _mutex;
使用mutable
放松对使用此限定符声明的成员变量的const
约束,这是一种绕过constness的方法,所以小心不要滥用它。 在这种情况下,它似乎是合理的,因为互斥体是类的内部工具,并且不参与“逻辑常量”(与“按位常量”相反)。
这段代码应该编译
class MyClass
{
mutable boost::mutex _mutex;
void foo() const
{
boost::mutex::scoped_lock lock(_mutex);
//critical section
}
}
Raistmaj是对的。
原因是常量方法保证它不会更改其类实例。 通过声明互斥锁可变,您为该变量设置了一个例外。
出现此问题的原因是boost::mutex::scoped_lock
的构造函数调用的boost::mutex::lock()
不是 const
成员函数。 由于互斥锁是MyClass
的成员,这意味着无法从MyClass
的非const
成员函数调用MyClass::_mutex::lock()
。
解决方案是将互斥锁声明为mutable
成员。 这向编译器表明即使在const
成员函数中也可以修改_mutex
:
class MyClass
{
mutable boost::mutex _mutex;
void foo() const
{
boost::mutex::scoped_lock lock(_mutex);
//critical section
}
}
请你能解释为什么它不起作用。 锁定_mutex是'修改'吗?
确切地说,_mutex对象会将其内部状态从“解锁”状态更改为“已锁定”状态。 因此,您需要mutable关键字fora const-function来保留函数的逻辑const,同时允许互斥体可修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.