Thread :: Join vs detach

时间:2017-08-16 14:27:51

标签: c++ multithreading c++11

为什么我要使用std::thread::join然后等到此线程结束?我认为多线程的目的是,我开始更多的线程。 我也可以“正常”调用函数,而不是join(),而不是foo()。 那么为什么他们的join()?我不是唯一需要detach()的东西吗?

1 个答案:

答案 0 :(得分:4)

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

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之外的其他一些对象或函数中。从您的设计来看,是否分离是非常明显的。 (但我们必须始终detachjoin std::thread才能超出范围)