[英]Which will be executed first, RAII or function return value
MyClass
有一个成员函数,需要返回它的'成员变量,并且该函数必须是线程安全的,所以我使用互斥锁来保护数据。
我有两个实现如下:
版本1:
string MyClass::name() {
m_mutex.lock();
string temp = m_name;
m_mutex.unlock();
return temp;
}
版本2:
string MyClass::name() {
MutexLocker lock(mutex);
return m_name;
}
我知道版本1没有问题,但我需要输入更多代码。
问题是,我不确定版本2是否正确。 在线程访问m_name
之前是否会释放互斥锁?
版本2也是正确的(事实上,这比第一版更好 !)。
在通过本地对象的析构函数释放互斥锁之前,首先复制该值。 相反的情况是不可能的,因为本地对象在超出范围时会被销毁,但是您必须注意必须在范围内执行return语句,因此它必须在销毁之前发生。 相反,在本地对象超出范围后,无法执行return语句。
从调用堆栈的角度来看,当堆栈开始展开时会破坏本地对象,但是在堆栈展开之前很久就会执行包含return语句的函数。 这确保在释放互斥锁之前复制m_name
。
或者想想这个简单的代码:
std::string f()
{
std::string s = "Nawaz";
return s; //Think of this line!
}
是s
其销毁后复制1? 这甚至可能吗? 如果在销毁之后复制s
是不是不能用C ++编程?
或者更好的说, 感动 。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.