11

get_a()函数对于竞争条件是否安全,或者我是否需要显式复制str_才能get_b()获得线程安全函数?

class Class {
public:
  auto get_a() -> std::string {
    auto&& guard = std::lock_guard{mutex_};
    return str_;
  }
  auto get_b() -> std::string {
    auto&& guard = std::lock_guard{mutex_};
    auto str = str_;
    return str;
  }
private:
  std::mutex mutex_{};
  std::string str_{};
};

注意:我知道 Stack Overflow 上有类似的问题,但我找不到明确回答这个问题的问题。

4

1 回答 1

14

[stmt.return]p3

调用结果的复制初始化在语句操作数建立的完整表达式末尾处的临时变量的销毁之前排序,而该return语句的操作数反过来又在封闭块的局部变量的销毁之前排序return声明。

这意味着按顺序发生以下情况:

  1. 返回对象是复制初始化的
  2. return 语句中的任何临时对象都被销毁
  3. 局部变量被销毁

因此,我们可以推断这get_a是完全安全的。

于 2018-12-04T13:07:52.990 回答