【问题标题】:How to use lock_guard when returning protected data返回受保护数据时如何使用 lock_guard
【发布时间】:2011-04-20 21:08:46
【问题描述】:

我有一个关于使用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;
}

【问题讨论】:

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


    【解决方案1】:

    在您的第一个示例中直接返回是正确的。返回值是在局部变量被销毁之前构造的,因此在锁被释放之前。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        销毁本地对象和复制返回值的顺序是怎样的?

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

        返回值优化对此有何影响?

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

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

        【讨论】:

          猜你喜欢
          • 2020-06-05
          • 2014-08-07
          • 2017-11-24
          • 2018-10-17
          • 2017-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多