返回受保护数据时如何使用lock_guard

时间:2010-10-04 15:35:37

标签: c++ multithreading locking thread-safety boost-thread

我有一个关于使用boost::lock_guard(或类似的范围锁)并使用return语句中应该受锁保护的变量的问题。

如何销毁本地对象并复制返回值?返回值优化如何影响这个?

示例:

Data Class::GetData()
{
    boost::lock_guard<boost::mutex> lock(this->mMutex);
    return this->mData;
}

这是否正确(如果mData是受mMutex保护的变量)?或者我是否必须使用本地范围和临时,如下例所示:

Data Class::GetData()
{
    Data ret;
    {
        boost::lock_guard<boost::mutex> lock(this->mMutex);
        ret = this->mData;
    }
    return ret;
}

3 个答案:

答案 0 :(得分:23)

如第一个例子中那样直接回归是正确的。返回值是在销毁局部变量之前构造的,因此在锁定被释放之前构建。

答案 1 :(得分:3)

  

如何销毁本地对象并复制返回值?

通常,堆栈对象会以创建的相反顺序销毁。如前所述,您指定的两种方法都将提供所需的行为。

  

返回值优化如何影响这个?

这里不应该关注RVO - 所有这一切都是将输出对象直接构造到堆栈帧缓冲区中 - 避免了创建命名临时对象的开销(如上面的第2个示例所示)。这是在调用本地析构函数之前完成的。

您最好使用上面示例1中的代码。

答案 2 :(得分:0)

两件都是等价的。事实上,对于案例#1 - C ++编译器将创建在案例#2中描述的结构。所以#1更可取。