2012-02-22 7 views
4

私はウィンドウの最初の作業をしていません。私はここに記載された技術を試してみました。(C++)メインスレッドを中断してから別のスレッドを再開するにはどうしたらいいですか?

基本的には、結果を出力する前にメインスレッドを一時停止する必要があるWebクローラーを構築しています。私の最後のpthreadが死ぬときにメインスレッドを再開する必要があります。私は私の最後のpthreadが死ぬときのポイントを知っている、私はちょうどメインスレッドを中断または再開する方法を知らない。

ご協力いただきありがとうございます。

EDIT:

ので、おそらく唯一の1つのワーカースレッドは、私がメインのサスペンド/レジュームしたいポイントに存在します。私はコンストラクタでそれをやっていて、リンクが増えるとスレッドが生成されます。

答えて

6

メインスレッドでは、各ワーカースレッドでpthread_join()を呼び出します。

+0

したがって、おそらく1つのワーカースレッドだけが、メインを一時停止/再開したい時点に存在します。私はコンストラクタでそれをやっていて、リンクが増えるとスレッドが生成されます。 –

+1

シルバー、すべてのスレッドにハンドルを保持する必要があります。特に、実行中のすべてのスレッドについて知っておく必要があるクローラを終了するときは、正常にシャットダウンできるようにしてください。さらに、より多くのリンクを獲得すると、より多くのスレッドを生成するのではなく、固定されたスレッドのプールを使用してクロールする方が良いでしょう。あなたがスレッドのプールを使用する場合、それは上記を行うことは非常に簡単になります。 – Kiril

+0

ああ、ええ、それは素晴らしいアイデアです!どうもありがとうございました! –

2

それはあなたのために働くだろう基本的な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; 
} 
+0

これは私のスレッドが動的に作成されていることを除いて、私が必要としているようなものです...スレッドの数が変化している間にループを行うことができますか? –

+1

もちろん、あなたが作成したスレッドを保持しているデータ構造が必要になります。この例では、単純なので配列を使用しています。すべてのスレッドが一緒に戻ってくる準備が整ったら、そのデータ構造を(例の配列と同様に)トラバースし、スレッドごとにpthread_join()を呼び出します。 –

0

メインスレッドは通常、あなたが他のスレッドを制御するところからスレッドです。すべての他のスレッドが完了するまで待つ必要がある場合は、メインスレッドから監視しないでください。メインスレッドを制御する別のスレッドを作成することは設計上の欠陥のようです。

関連する問題