线程::加入与分离

Thread::Join vs detach

本文关键字:分离 线程      更新时间:2023-10-16

为什么要使用std::thread::join然后等到这个线程结束?我认为多线程的目的是,我平行启动更多的线程。 除了join(),我还可以"正常"调用函数,比如foo()。 那么为什么他们的join()呢?我唯一需要detach()的不是吗?

考虑一下这里发生的事情:

int value = 0;
void myWorkerFunction(){value = 1;}
int main()
{
std::thread t(myWorkerFunction);
t.detach();
std::cout << value << std::endl;
}

您现在具有争用条件。您的线程可能会也可能不会完成在需要打印之前需要value完成的所有工作。*

join视为一种像mutex这样的同步形式;您必须等待正在执行的线程释放互斥锁(完成(才能继续。

有时分离线程是有意义的,如果说,它可以"在后台工作"执行可能不是关键任务的任务。

我认为多线程的目的是,我启动更多的线程平行[原文如此]

您不会被迫在创建线程后立即join线程。您可以创建 N 个线程,然后执行其他一些工作。只有当你想保证一个线程已经完成时,你才需要join


*为了解释起见,此示例过于简化。线程创建通常发生在main之外的其他对象或函数中。是否分离通常从您的设计中很明显。(但是,我们必须始终detachjoinstd::thread,以免超出范围(