C++;多线程-初学者查询 我正在学习C++中的多线程。下面是一个教程,该教程给出了这个示例,解释了使用移动语义从一个线程“移动”到另一个线程的方法: std::thread thread_1( func_1 ); std::thread thread_2 = std::move( thread_1 ); thread_1 = std::thread(func_2); std::thread thread_3 = std::move(thread_2); thread_1 = std::move(thread_3);

C++;多线程-初学者查询 我正在学习C++中的多线程。下面是一个教程,该教程给出了这个示例,解释了使用移动语义从一个线程“移动”到另一个线程的方法: std::thread thread_1( func_1 ); std::thread thread_2 = std::move( thread_1 ); thread_1 = std::thread(func_2); std::thread thread_3 = std::move(thread_2); thread_1 = std::move(thread_3);,c++,multithreading,C++,Multithreading,最后一行thread_1=std::move(thread_3)被认为不是一种正确的方法,因为(据我理解): “thread_1”和“thread_3”都是拥有某些函数的现有线程(thread_1拥有func_2,thread_3拥有func_1),您应该使用.detach()或.join()管理它们的生命周期 这是教程中给出的解释,但是对我来说没有100%的意义。请帮助我更好地理解为什么这行代码不是在线程之间转移所有权的正确方法。谢谢大家! 我认为关键是,不能将正在运行的线程移动到已经在运行线

最后一行
thread_1=std::move(thread_3)被认为不是一种正确的方法,因为(据我理解):

“thread_1”和“thread_3”都是拥有某些函数的现有线程(thread_1拥有func_2,thread_3拥有func_1),您应该使用.detach()或.join()管理它们的生命周期


这是教程中给出的解释,但是对我来说没有100%的意义。请帮助我更好地理解为什么这行代码不是在线程之间转移所有权的正确方法。谢谢大家!

我认为关键是,不能将正在运行的线程移动到已经在运行线程的线程对象上。如果这样做,程序将通过调用
std::trerminate
结束

请参阅参考资料


您只能将正在运行的线程移动到默认构造(没有函数)的线程对象上,或者之前从中移动过的线程对象上,或者将其合并/分离(保留为空)。

实际上,赋值的右侧(
thread\u 3
)是不相关的。不能将分配给可连接的
std::thread
对象(操作系统线程的句柄),否则调用
std::terminate


您的问题没有显示出对
std::thread
变量、
std::thread
值和线程之间的差异有多少了解。这是三件不同的事情。您的三条初始化和赋值语句将值从一个变量移动到另一个变量(或尝试移动)
std::thread

移动
std::thread
值时,实际上是在调用函数:这是一个函数调用:

thread_1 = std::move(thread_3);
它正在调用名为

std::thread::operator= (std::thread&& other)
它有三个功能。它必须首先销毁(即有效调用的析构函数)
thread\u 1
的值,然后将
thread\u 3
值的内部复制到
thread\u 1
中,最后必须有效地“调零”thread\u 3
变量

这在第一步失败——销毁旧的
线程\u 1
值——因为该线程已经在运行

线程不是变量,也不是变量的值。线程是操作系统内核中的一个对象,
thread\u 1
变量的值只是操作系统对象的句柄


std::thread
类强制执行的规则之一是,除非您以前调用了
detach()
方法,否则它不允许您销毁正在运行的线程的句柄。
detach()
方法只设置了一个标志,表示“相信我,我知道我在做什么,我不再需要句柄,因为我不再需要对正在运行的线程施加控制。”

是否允许共享到教程的链接。更多的上下文可能有助于人们回答您的问题。从参考开始,或者更好地从一个好的输入开始。@MikeMB thnx作为输入