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

时间:2013-11-24 07:11:52

标签: c++ multithreading

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之前释放互斥锁?

1 个答案:

答案 0 :(得分:14)

版本2也是正确的(实际上,它比第一个版本更好!)。

在通过本地对象的析构函数释放互斥锁之前,首先复制该值。相反的情况是不可能的,因为本地对象在超出范围时会被销毁,但是您必须注意必须在范围内执行return语句,因此它必须在销毁之前发生。相反,在本地对象超出范围后,无法执行return语句。

从调用堆栈的角度来看,当堆栈开始展开时会破坏本地对象,但是在堆栈展开之前很久就会执行包含return语句的函数。这样可以确保在释放互斥锁之前复制m_name

或者想到这个简单的代码:

std::string f()
{
    std::string s = "Nawaz";
    return s; //Think of this line!
}

在销毁之后,s是否复制了 1 ?这甚至可能吗?如果{<1}}在被破坏之后被复制,它是不是不可能在C ++中进行编程?

1。或者更好的说,移动。 : - )功能