繁体   English   中英

哪个将首先执行,RAII或函数返回值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM