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

Which will be executed first, RAII or function return value

本文关键字:RAII 函数 返回值 执行      更新时间:2023-10-16

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++中的编程变得不可能吗?

1.或者更好地说,移动。:-)