Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回受保护的数据时如何使用lock_guard_C++_Multithreading_Locking_Thread Safety_Boost Thread - Fatal编程技术网

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中的代码