それはあなたのために働くだろう基本的なfork-join modelように聞こえる:スレッドが参加
は、プログラマが論理的な同期ポイントですべての 関連のスレッドを収集できるようにするプロトコルです。たとえば、 fork-join parallelismの場合、スレッドは並列タスク に対処するために生成され、 それぞれのタスクを完了した後でメインスレッドに戻って結合します(したがって、結合の暗黙のバリアを実行します)。 ポイント。ジョインを実行するスレッドは、それぞれのスレッド関数の実行を終了していることに注意してください。 後で同じドキュメント内の例から
:
int main(int argc, char **argv) {
pthread_t thr[NUM_THREADS];
int i, rc; /* create a thread_data_t argument array */
thread_data_t thr_data[NUM_THREADS]; /* create threads */
for (i = 0; i < NUM_THREADS; ++i) {
thr_data[i].tid = i;
if ((rc = pthread_create(&thr[i], NULL, thr_func, &thr_data[i]))) {
fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
return EXIT_FAILURE;
}
}
/* block until all threads complete */
for (i = 0; i < NUM_THREADS; ++i) {
pthread_join(thr[i], NULL);
}
return EXIT_SUCCESS;
}
したがって、おそらく1つのワーカースレッドだけが、メインを一時停止/再開したい時点に存在します。私はコンストラクタでそれをやっていて、リンクが増えるとスレッドが生成されます。 –
シルバー、すべてのスレッドにハンドルを保持する必要があります。特に、実行中のすべてのスレッドについて知っておく必要があるクローラを終了するときは、正常にシャットダウンできるようにしてください。さらに、より多くのリンクを獲得すると、より多くのスレッドを生成するのではなく、固定されたスレッドのプールを使用してクロールする方が良いでしょう。あなたがスレッドのプールを使用する場合、それは上記を行うことは非常に簡単になります。 – Kiril
ああ、ええ、それは素晴らしいアイデアです!どうもありがとうございました! –