如何始终运行固定数量的线程

How to run a fixed number of threads all the time

本文关键字:线程 何始终 运行      更新时间:2023-10-16

我刚刚开始使用多线程。问题是我的代码没有启动一个新的线程一旦一个已经完成,而是启动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();
}

我发现了这个,但它对我一点帮助都没有。我正在考虑使用std::promise, std::future或std::packaged_task来监视线程是否已经完成,但我不知道如何在他的位置上生成另一个线程。

在我的情况下,我只需要X线程运行我的方法与不同的参数和他们自己的干净的对象的myClass。我不能发送我的计算工作,因为它需要类内的所有数据。

你可以尝试或创建一个线程池,但我仍然尝试了许多开源的c++11线程池,几乎所有的线程池都有bug(死锁或崩溃在某个点)或有设计缺陷,使它们无用。你可以在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;
    }
};

您应该查看某种线程池,或者使用std::async(根据您的实现,它可能在下面使用线程池)。