如何始终运行固定数量的线程
How to run a fixed number of threads all the time
我刚刚开始使用多线程。问题是我的代码没有启动一个新的线程一旦一个已经完成,而是启动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
(根据您的实现,它可能在下面使用线程池)。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- 通知线程是否始终需要在修改期间锁定共享数据
- win32程序应该始终是多线程的吗
- 我的多线程游戏始终为100%CPU.如何管理线程活动以减少CPU负载
- 当read_json在多个线程中使用时,我们可以始终使用BOOST_SPIRIT_THREADSAFE标志而不与 boo
- 如果不同的线程始终使用不同的键,它们是否可以插入到映射中
- 如何确保始终存在给定数量的线程?(另外,这是线程的良好用法吗?
- CreateTimerQueue() 线程从何而来
- 我应该在多线程编程中始终锁定全局数据吗?为什么
- 如何始终运行固定数量的线程
- std::map::end 线程安全,并保证它对于同一容器始终相同