gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:36 28 4
gpt4 key购买 nike

我刚刚开始使用多线程。问题是我的代码不会在一个线程完成后启动一个新线程,而是在最后 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com