5

何百万回も呼び出される関数があり、この関数によって実行される作業はマルチスレッドです。関数は次のとおりです。

void functionCalledSoManyTimes()
{
  for (int i = 0; i < NUM_OF_THREADS; i++)
  {
    pthread_create(&threads[i], &attr, thread_work_function, (void *)&thread_data[i]);
  }
  // wait
}

関数が呼び出されるたびにスレッドを作成し、thread_work_function. はthread_work_function単に一連の配列を処理し、thread_data構造体にはそれらの配列へのポインターと各スレッドが担当するインデックスが含まれます。

この方法でアルゴリズムをマルチスレッド化すると、パフォーマンスが 20% 以上向上しましたが、私のプロファイリングでは、pthread_create を繰り返し呼び出すと、かなりのオーバーヘッドが発生することがわかりました。

私の質問は:pthread_create関数が呼び出されるたびに呼び出すことなく、私の目標を達成する方法はありますか?

問題が解決しました。

皆さん、ありがとう、私はあなたの助けに本当に感謝しています! あなたのヒントを使用して、ここに解決策を書きました。

4

2 に答える 2

3

スレッドの固定セットを開始し、スレッド間通信システム (リング バッファーなど) を使用してデータを処理に渡すだけです。

于 2012-09-04T17:30:47.397 に答える
2

問題を優雅に解決することはそれほど簡単ではありません。functionCalledSoManyTimesスレッド プールに静的ストレージを使用できますが、それ自体を複数のスレッドから呼び出すことができる場合はどうなるでしょうか。それは良いデザインではありません。

この種の状況を処理するために私が行うことはpthread_key_create、最初の呼び出しで (を使用して) スレッド ローカル ストレージ キーを作成し、特定のスレッドで初めて呼び出されたpthread_onceスレッド プールをそこに格納することです。スレッドが存在するときに呼び出されるデストラクタ関数を提供できます。この関数は、スレッド プール内のワーカー スレッドに (または他のメカニズムを介して) 終了するように通知する役割を果たします。pthread_setspecificfunctionCalledSoManyTimespthread_key_createpthread_cancel

于 2012-09-04T17:41:35.513 に答える