主题::加入与分离

RoQ*_*riX -1 c++ multithreading c++11

为什么我要使用std::thread::join然后等到这个线程结束?我认为多线程的目的是并行启动更多线程。代替join(),我也可以“正常”调用该函数,例如foo(). 那么为什么是他们的join()?不是我唯一需要的东西detach()吗?

And*_*dyG 5

考虑一下这里发生了什么:

int value = 0;
void myWorkerFunction(){value = 1;}

int main()
{
   std::thread t(myWorkerFunction);
   t.detach();
   std::cout << value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

你现在有一个竞争条件。您的线程可能会也可能不会完成它在value需要打印之前需要做的所有工作。*

考虑join是一种同步形式,如mutex; 您必须等待正在执行的线程释放互斥锁(完成)才能继续。

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

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

join创建线程后,您不会立即被强制使用该线程。你可以创建 N 个线程,然后去做一些其他的工作。只有当您想保证线程已完成时,您才需要join.


*为了便于解释,这个例子过于简单化了。线程创建通常发生在main. 是否分离通常从您的设计中很明显。(但是我们必须在它超出范围之前始终detachjoina std::thread