【问题标题】:std::move operation C++std::move 操作 C++
【发布时间】:2017-08-22 19:11:07
【问题描述】:

安东尼·威廉姆斯书中的台词:

以下示例显示了使用 std::move 转移所有权 将动态对象转换为线程:

void process_big_object(std::unique_ptr<big_object>);

std::unique_ptr<big_object> p(new big_object);
p->prepare_data(42);
std::thread t(process_big_object,std::move(p));

通过在 std::thread 构造函数中指定 std::move(p)big_object 的所有权首先转移到 internal 新创建线程的存储,然后进入 process_big_object.

我了解堆栈和堆;任何想法,这个 internal storage 到底是什么?

他们为什么不能将所有权直接转让给process_big_object

【问题讨论】:

  • 每个线程都有自己的堆栈。线程对象需要首先请求创建自己的堆栈和其他操作系统资源,然后才能以自己的堆栈为基础调用您的函数。所以它需要在分派给你的函数之前将数据存储在某个地方。
  • 谢谢,@PeterT。这回答了我问题的最后一部分。

标签: c++ multithreading c++11 move


【解决方案1】:

表示该对象将暂时属于std::thread对象,直到线程真正启动。

这里的内部存储是指与std::thread 对象关联的内存。它可能是一个成员变量,或者只是在构造函数期间保存在堆栈中。由于这是依赖于实现的,因此使用了通用且不明确的“内部存储”术语。

【讨论】:

  • 两个答案都一样好。最后一行接受这个。
【解决方案2】:

线程的所有参数都被复制到std::thread 对象持有的一些内部内存中,因此可以将其传递给线程函数。

在所有权传递给实际线程函数之前,该内部内存由 std::thread 对象拥有。

【讨论】:

    【解决方案3】:

    他们为什么不能将所有权直接转让给process_big_object

    因为在代码 sn-p 中没有将process_big_object 作为函数调用的行。 sn-p 的最后一行调用std::thread 构造函数。它将启动一系列事件,最终导致process_big_object(p) 在新线程中被调用;但该调用在此处不可见。

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 2017-05-28
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      • 2016-02-22
      • 2023-03-22
      相关资源
      最近更新 更多