4

CURL を使用して Web に情報を投稿する C アプリケーションを作成する必要があります。アプリケーションは、最大で N 個 (10 個としましょう) の要求を並行して実行する必要があります。を使用する特定のスレッドではなく、どのスレッドも終了するのを待つにはどうすればよいですかpthread_join()

pthread_cond_wait について読みましたが、ほとんどの例は、制御スレッド (メイン) がワーカー スレッドを起動する方法です。正反対のことが必要です-ワーカースレッドは、終了する前に親スレッドにシグナル/ウェイクアップできる必要があります。

更新:実際には、マネージャー スレッドをスリープ状態にする方法が必要です。ワーカー スレッドがジョブを終了したら、マネージャー スレッドを起動して別のジョブを与える必要があります。スレッドが終了して新しいスレッドがジョブ用に作成されるか、スレッド プールが使用されるかは問題ではありません。ジョブが終了したことをマネージャーに知らせる方法がまだ必要です。

この提案を受け取らないことを願っています

while(asleep){
  for(i = 0; i< threadCount; i++){
    pthread_mutex_lock(mutex);
    if(threads[i] == IDLE_STATE)
      startNewJob();
    pthread_mutex_unlock(mutex);
    usleep(100*1000);
  }
}
4

3 に答える 3

4

オンデマンドでスレッドを作成/破棄するよりも、起動時に10個のワーカースレッドのプールを作成し、メインプログラムにジョブをフィードさせる方が簡単です。

起動時に、10人のワーカーの配列を作成します。これらは次のようになります

typedef struct worker
{
    pthread_t       thread;
    pthread_cond_t  cond;
    pthread_mutex_t mutex;
    struct job*     job;
    int             quit;
} worker;

jobマネージャーは、メンバーを設定してからワーカーにシグナルを送信することにより、各スレッドに順番にジョブを委任します。

quit各ワーカーは、ゼロ以外になるまでループし、その状態が通知されるのを待ちます。各シグナルの後、結果を報告する前に読み取り/処理jobを行い、その状態を再度待機します。

編集:あなたはスレッドプールに熱心ではありません。代わりに、各スレッドに一意のIDを指定してみてください。各スレッドのIDと他のプロパティ間のマッピングをマネージャーに保存します。各スレッドが完了したら、そのIDをマネージャーが所有するリストに追加してから、マネージャーの状態を通知します。マネージャーがウェイクアップするたびに、リストからヘッドをプルし、適切なスレッドを検索し、ジョブの結果を読み戻して、スレッドに参加することができます。ここでのマネージャーのリストには複数のスレッドがアクセスするため、読み取り/書き込みはミューテックスで保護する必要があることに注意してください。

Edit2:条件についてもっと知りたいのですが、役に立った例が見つかりません。これがもっと良くなるかどうかはわかりませんが、ここに私が書いたコードがあります。関数はOsSemaphore*、条件を単純な待機/信号APIにラップします。

于 2012-12-13T11:02:52.257 に答える
1

条件変数は、あなたが求めているものです。それらは、ワーカー スレッドからマネージャー スレッドにシグナルを送るのと同じように簡単に使用でき、その逆も同様です。

最後のストローマンの例は、実際には条件変数を使用してできることと非常によく似ています。

pthread_mutex_lock(&mutex);
while (!finished) {
  for(i = 0; i < threadCount; i++) {
    if(threads[i] == IDLE_STATE)
      startNewJob(i);
  }

  /* Not finished, and no idle threads, so wait */
  if (!finished)
    pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);

スレッドが完了すると、次のようになります。

pthread_mutex_lock(&mutex);
threads[self] = IDLE_STATE;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
于 2012-12-15T03:01:31.727 に答える
1

条件変数が必要です。これまで見てきたのと同じ関数ですが、向きを変えただけです。あなたが待っている状態は、「ワーカースレッドが何らかの作業を終えた」ということです。

メインスレッドは次のことを行います:

  • ロックミューテックス
  • スレッドが終了していない間: pthread_cond_wait
  • ミューテックスのロックを解除
  • 仕事をスケジュールする
  • ループ

各ワーカー スレッドは、作業が終了すると次のことを行います。

  • ロックミューテックス
  • マーク完了
  • pthread_cond_signal
  • ミューテックスのロックを解除
  • 終了または仕事を待つ
于 2012-12-14T16:24:17.967 に答える