如何一直运行固定数量的线程

时间:2014-08-13 13:57:24

标签: c++ multithreading

我刚开始使用多线程。问题是我的代码一旦完成就不会启动新线程,而是在最后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清理对象。我无法发送计算工作,因为它需要课程中的所有数据。

2 个答案:

答案 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(根据您的实现,可能会使用下面的线程池)。