为什么c ++线程可移动但不可复制?

时间:2016-01-27 12:11:43

标签: c++ multithreading pthreads stdthread

正如问题的标题所说,为什么C ++线程(std::threadpthread)可移动但不可复制?如果我们确实使其可以复制,会产生什么后果?

2 个答案:

答案 0 :(得分:2)

关于复制,请考虑以下代码段:

void foo();

std::thread first (foo);     
std::thread second = first; // (*)

当标记为(*)的行发生时,可能已经执行了一些foo。那么预期的行为是什么呢?从一开始就执行foo?停止线程,复制寄存器和状态,然后从那里重新运行它?

特别是,鉴于function objects现在已成为标准的一部分,通过重用函数对象,可以非常轻松地启动另一个执行与早期线程完全相同的操作的线程。

因此,没有太多动力可以开始。

关于移动,请考虑以下内容:

std::vector<std::thread> threads;

没有移动语义,这将是有问题的:当向量需要内部调整大小时,它如何将其元素移动到另一个缓冲区?有关此here的更多信息,请参阅。

答案 1 :(得分:2)

如果thread对象是可复制的,谁最终负责与thread对象关联的单个执行线程?特别是,join()对每个thread对象做了什么?

有几种可能的结果,但这就是问题,有几种可能的结果没有真正的重叠,可以作为一般用例编纂(标准化)。

因此,最合理的结果是1个执行线程与最多1个thread对象相关联。

这并不是说无法提供某些共享状态,只是用户需要在这方面采取进一步行动,例如使用std::shared_ptr