假设我正在创建多个线程,基于运行程序时给出的参数数量。 它的代码如下所示:
ProgThread aProgThreads[nArgc-1];
for(int p=0;p<nArgc-1;p++){
aProgThreads[p].init();
}
上面的代码将为每个参数创建一个对象。 之后,它将为每个对象调用init()
函数。 在此函数中,线程将按如下方式生成:
void ProgThread::init(){
std::thread oMainThread(&ProgThread::loop, *this); //Creates a thread that executes the loop function
}
现在,由于我要处理多个希望同时执行的线程,所以不能在init()
函数中连接它们。 这意味着我必须加入他们之后,他们已经全部创建。 按照当前编写此代码的方式,这是不可能的,因为OmainThread
不会存在于init()
函数之外。 有没有一种方法,我可以使它,我可以有一个单独的循环,连接所有的线程? 它应该是这样的:
for(int p=0;p<nArgc-1;p++){
aProgThreads[p].joinThread();
}
与
void ProgThread::joinThread(){
oMainThread.join();
}
提前谢谢!
您的示例中的主要问题是OnInit
中的std::thread OmainThread
。 这会创建一个线程,是的,但是当您从oninit
返回时,它也会尝试破坏线程。 而且这确实会失败,因为OmainThread
还没有连接。
相反,join
需要位于ProgThread
的析构函数中,这意味着OmainThread
需要是成员。 当然,与所有成员一样,它应该在ProgThread
的构造函数中初始化。
您想要循环的唯一原因是当您的线程需要在加入之前被告知何时停止时。 在这种情况下,明智的做法是告诉所有线程停止,然后才开始加入它们。 告诉一个线程停止,然后连接那个线程,然后告诉下一个线程,等等,会花费更多的时间。