我刚开始使用多线程。问题是我的代码一旦完成就不会启动新线程,而是在最后4个线程完成时启动4个线程,所以如果任务花费的时间不等,那么效率并不高,我有数千个每次处理的课程。
Loop()
{
myClass A,B,C,D;
std::thread td1(&myClass::run, &A, args[i]);
std::thread td2(&myClass::run, &B, args[i+1]);
std::thread td3(&myClass::run, &C, args[i+2]);
std::thread td4(&myClass::run, &D, args[i+3]);
td1.join();
td2.join();
td3.join();
td4.join();
}
我找到了this,但它根本没有帮助我。我正在考虑使用std :: promise,std :: future或std :: packaged_task来监视线程是否已经完成,但我不知道如何在他的位置产生另一个线程。
在我的情况下,我只需要X线程运行我的方法,使用不同的参数和他们自己的myClass清理对象。我无法发送计算工作,因为它需要课程中的所有数据。
答案 0 :(得分:3)
您可以尝试或创建一个线程池,但我尝试了很多开源c ++ 11 ThreadPools并且几乎所有都被窃听(死锁或在某些时候崩溃)或者有一个设计缺陷使它们变得无用。您将在github上找到大约十二个线程池。
最简单的解决方案是使用一个(或多个)WorkQueue,每个线程都可以向队列添加一些工作或只处理工作(如果多个队列,线程将尝试从每个队列中获取作业,如果所有队列都是把它弄空了只是睡了一会儿。)
然后你只需要一个像这样的课程
class myClass: public virtual Runnable{
WorkQueue * q;
std::atomic<bool> running=true; //used to kill the thread
public:
myClass(WorkQueue * que):q(que){
}
/* IMPLEMENTS: Runnable*/
public virtual void run(){
int i=0;
Job * j=nullptr;
while(running){
j=q[i]->getNextJob();
if(j){
j->run();
if(j->hasJobsToDispatch())
i++;
}else{
i++;
}
if(i>=queuesNumber)
i=0;
q[i]->addSomeJob(j->getJobsToDispatch());
}
}
void stopThread(){
running!=running;
}
};
答案 1 :(得分:1)
您应该查看某种thread pool或使用std::async
(根据您的实现,可能会使用下面的线程池)。