我尝试使用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(struct的向量)中,并且是独立的 谢谢你的帮助。
答案 0 :(得分:3)
最好使用与cpu所具有的核心数一样多的线程来创建线程池。然后将任务提供给此池并让它完成其工作。您应该查看this blog post right here以获取有关如何创建此类线程池的一个很好的示例。
该帖子中未提及的一些提示:
std::thread::hardware_concurrency()
获取核心数。std::packaged_task
或其他内容
这些行包含在一个类中,这样您就可以跟踪诸如任务完成之类的事情,或者实现task.join()
。std::future
支持{。{3}}。答案 1 :(得分:2)
您可以使用信号量来限制并行线程的数量,这里是伪代码:
Semaphore S = MAX_THREADS_AT_A_TIME // Initial semaphore value
declare handle_array[NUM_ITERS];
for(i=0 to NUM_ITERS)
{
wait-while(S<=0);
Acquire-Semaphore; // S--
handle_array[i] = Run-Thread(MyThread);
}
for(i=0 to NUM_ITERS)
{
Join_thread(handle_array[i])
Close_handle(handle_array[i])
}
MyThread()
{
mutex.lock
critical-section
mutex.unlock
release-semaphore // S++
}