代码之家  ›  专栏  ›  技术社区  ›  Viktor Sehr

返回时的复制操作是在lock_guard析构函数之前还是之后执行的?[副本]

  •  8
  • Viktor Sehr  · 技术社区  · 7 年前

    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_{};
    };
    

    注意:我知道这里有关于堆栈溢出的类似问题,但我找不到一个明确回答这个问题的问题。

    1 回复  |  直到 7 年前
        1
  •  13
  •   Rakete1111    7 年前

    [stmt.return]p3

    调用结果的复制初始化在由调用的操作数建立的完整表达式结束时销毁临时变量之前排序 return 语句,然后在销毁包含 返回 陈述

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

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

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

    推荐文章