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

标签 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 干净对象运行我的方法。我无法发送我的计算作业,因为它需要类中的所有数据。

最佳答案

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

关于c++ - 如何一直运行固定数量的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288137/

相关文章:

c++ - YUV转RGB着色器边框神器

c++ - Microsoft Threads,设置安全和访问权限

java - 我如何在 java 中切换红绿灯,因为每个灯应该使用多线程分别只吹 3 秒?

java - 如何安全发布StringBuffer?

C++ 初学者 : function call on object not executing properly

c++ - 如何使用编译时字符串(C++14)创建 boost::hana::map ?

c++ - 使用 C++-AMP 访问缓冲区

C++递增指向数组的指针

multithreading - TThread 的后代,从主线程访问属性

java - 在终止状态线程上运行()