我尝试使用 pthread 更快地完成一些任务。我有数千个文件(在 args 中)要处理,我只想多次创建少量线程。
这是我的代码:
void callThread(){
int nbt = 0;
pthread_t *vp = (pthread_t*)malloc(sizeof(pthread_t)*NBTHREAD);
for(int i=0;i<args.size();i+=NBTHREAD){
for(int j=0;j<NBTHREAD;j++){
if(i+j<args.size()){
pthread_create(&vp[j],NULL,calcul,&args[i+j]);
nbt++;
}
}
for(int k=0;k<nbt;k++){
if(pthread_join(vp[k], NULL)){
cout<<"ERROR pthread_join()"<<endl;
}
}
}
}
它返回错误,我不知道这是否是解决我问题的好方法。所有资源都在 args(结构 vector )中并且是独立的。
感谢您的帮助。
最佳答案
你最好创建一个线程池,线程数与 cpu 的内核数一样多。然后将任务提供给这个池并让它完成它的工作。你应该看看this blog post right here有关如何创建此类线程池的一个很好的示例。
该帖子中未提及的一些提示:
- 使用
std::thread::hardware_concurrency()
获取内核数。 - 想办法存储任务,提示:
std::packaged_task
或其他东西 这些行包装在一个类中,因此您可以跟踪诸如任务何时完成之类的事情,或者实现task.join()
。 - 另外,可以在 github 上找到他的实现代码以及一些额外的东西,例如
std::future
支持 here .
关于C++ pthread限制线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506165/