正如问题的标题所说,为什么C ++线程(std::thread
和pthread
)可移动但不可复制?如果我们确实使其可以复制,会产生什么后果?
答案 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
。