哪个将首先执行,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++中的编程变得不可能吗?
1.或者更好地说,移动。:-)
相关文章:
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- 避免在构造函数中分配或保持简单性(和 RAII?
- 如果RAII构造函数抛出呢
- 将 RAII 结构作为 2D 数组传递到函数中
- C++使用RAII和抛出的析构函数
- C++:使用RAII解析构造函数-初始化器列表依赖项
- 哪个将首先执行,RAII或函数返回值
- 如何处理 RAII 的构造函数失败
- 在单个(成员)函数的范围之外应用 RAII
- RAII 在两个构造函数之间进行选择的方式
- RAII 多个构造函数
- GUI 和 RAII:通过析构函数或窗口关闭、窗口生命周期进行 Cleenup
- 构造函数中的 RAII 和异常
- 从 RAII 类的析构函数引发异常
- 在具有移动语义的RAII类中,默认构造函数应该做什么
- 当构造函数抛出异常时,RAII是如何工作的
- 通过构造函数和析构函数实现 RAII 是否被认为是糟糕的"现代C++"?
- c++ RAII析构函数异常
- RAII和虚析构函数
- 当混合默认构造函数和非默认构造函数时,RAII是如何工作的