簡體   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