繁体   English   中英

c ++ pthread限制线程数

[英]c++ pthread limit number of thread

我试图使用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(结构的向量)中并且是独立的。
感谢帮助。

最好使线程池的线程数与cpu拥有的内核数一样多。 然后将任务提供给该池,并使其完成工作。 您应该在这里查看此博客文章 ,以获取有关如何创建此类线程池的绝佳示例。

该帖子中未提及的一些技巧:

  • 使用std::thread::hardware_concurrency()获取内核数。
  • 找出如何存储任务的方法,提示: std::packaged_task或包装在类中的内容,以便您可以跟踪诸如完成任务的时间之类的东西,或实现task.join()
  • 另外,在github上有他的实现代码以及一些额外的东西,例如std::future support可以在这里找到。

您可以使用信号量限制并行线程的数量,这是一个伪代码:

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++
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM