C++ 返回受保护的数据时如何使用lock_guard
我有一个关于使用C++ 返回受保护的数据时如何使用lock_guard,c++,multithreading,locking,thread-safety,boost-thread,C++,Multithreading,Locking,Thread Safety,Boost Thread,我有一个关于使用boost::lock\u guard(或类似作用域锁)和在return语句中使用应该由锁保护的变量的问题 销毁本地对象和复制返回值的顺序如何?返回值优化如何影响这一点 例如: Data Class::GetData() { boost::lock_guard<boost::mutex> lock(this->mMutex); return this->mData; } Data类::GetData() { boost::lock\u g
boost::lock\u guard
(或类似作用域锁)和在return
语句中使用应该由锁保护的变量的问题
销毁本地对象和复制返回值的顺序如何?返回值优化如何影响这一点
例如:
Data Class::GetData()
{
boost::lock_guard<boost::mutex> lock(this->mMutex);
return this->mData;
}
Data类::GetData()
{
boost::lock\u guard lock(这个->mMutex);
返回此->mData;
}
这是否正确(如果mData是受mMutex保护的变量)?或者我必须使用本地范围和临时范围,如下面的示例所示:
Data Class::GetData()
{
Data ret;
{
boost::lock_guard<boost::mutex> lock(this->mMutex);
ret = this->mData;
}
return ret;
}
Data类::GetData()
{
数据检索;
{
boost::lock\u guard lock(这个->mMutex);
ret=此->mData;
}
返回ret;
}
第一个示例中的直接返回是正确的。返回值是在销毁局部变量之前构造的,因此是在释放锁之前构造的。这两个部分是等效的。事实上,对于1×-C++编译器,将创建在第2类中描述的结构。因此#1更可取
销毁本地对象和复制返回值的顺序如何
通常,堆栈对象按与创建相反的顺序销毁。如前所述,您指定的两种方法都将提供所需的行为
返回值优化如何影响这一点
RVO在这里不应该是一个问题——它所做的只是将输出对象直接构造到堆栈帧缓冲区中——避免了创建命名临时对象的开销(如上面的第二个示例所示)。这是在调用本地析构函数之前完成的
最好使用上面示例1中的代码