std :: move操作C ++

时间:2017-08-22 19:11:07

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

安东尼威廉姆斯的书:

  

以下示例显示了使用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::move(p)构造函数中指定std::thread,   big_object的所有权首先转移到内部   存储为新创建的线程然后进入   process_big_object

我理解堆栈和堆;任何想法,这个内部存储实际上是什么?

为什么他们无法将所有权直接转移到process_big_object

3 个答案:

答案 0 :(得分:11)

这意味着该对象将临时属于std::thread对象,直到线程实际启动。

此处的内部存储是指与std::thread对象关联的内存。它可以是成员变量,也可以在构造函数中保存在堆栈中。由于这是依赖于实现的,因此使用了一般的,非常规的“内部存储”术语。

答案 1 :(得分:9)

线程的所有参数都被复制到std::thread对象保存的某个内部存储器中,因此可以传递给线程函数。

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

答案 2 :(得分:0)

  

为什么他们无法将所有权直接转移到while

因为代码段中没有将process_big_object作为函数调用的行。代码段的最后一行调用process_big_object构造函数。它将启动一系列事件,最终将导致在新线程中调用std::thread;但这个电话在这里看不到。