gpt4 book ai didi

c++ - 哪个先执行,RAII还是函数返回值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:15 25 4
gpt4 key购买 nike

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语句。

从调用堆栈的角度来看,本地对象在堆栈开始展开时被销毁,但是包含返回语句的函数在堆栈展开之前很久就被执行了。这确保了 m_name 在释放互斥量之前被复制了很多。

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

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

s 1 销毁后是否被复制?这可能吗?如果 s 销毁后被复制,难道不会使 C++ 编程变得不可能吗?

1。或者更好的说法是,感动了。 :-)

关于c++ - 哪个先执行,RAII还是函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20172089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com