1

pthread を使用して、いくつかのタスクをより高速に実行しようとしました。処理するファイルが数千ありますが、少数のスレッドを何度も作成したいと考えています。
これが私のコードです:

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 (構造体のベクトル) にあり、独立しています。
手伝ってくれてありがとう。

4

2 に答える 2

3

CPUが持つコアの数と同じ数のスレッドでスレッドプールを作成することをお勧めします。次に、タスクをこのプールにフィードして、その仕事をさせます。このようなスレッドプールを作成する方法の優れた例については、このブログ投稿をご覧ください。

その投稿で言及されていないいくつかのヒント:

  • std::thread::hardware_concurrency()コアの数を取得するために使用します。
  • タスクを保存する方法、ヒント:std::packaged_taskまたはクラスにラップされたそれらの行に沿った何かを理解して、タスクがいつ完了したかなどを追跡したり、を実装したりできるようにしますtask.join()
  • std::futureまた、彼の実装のコードに加えてサポートなどのいくつかの追加のものを備えたgithubはここにあります。
于 2013-01-24T16:46:05.770 に答える
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++
}
于 2013-01-24T17:08:38.693 に答える