2012-05-01 13 views
3

私はそれがすべてのスレッドを開始した後、メインスレッドは現在、無限ループに入りプロセスを実行し続けるには?

いくつかのものを行う複数のスレッドを起動するプロセスを持って、いくつかのポートに耳を傾けるなど:

それはのようなものです:

int main() 
{ 
    //start threads 
    while (true) 
    { 
     sleep(1000); 
    } 
} 

sleepは、メインスレッドがプロセッサを食べないことを保証します。

この方法は問題ありませんか?プロセスがどのように維持されているかについて業界標準がありますか?ありがとう。

EDIT:いくつかの明確化:

  • スレッドは、リスナーあるのでjoinまたはWaitForSingleObjectはオプションではありません。通常ここではjoinを使うことができますが、スレッドは第3のクライアントライブラリによって起動され、スレッドを制御することはできません。
  • メインスレッドで何らかの処理を行うことは、設計上の観点からは意味をなさない。
+0

メインループから抜け出す方法が必要ですか? – Nick

+3

スレッドに参加できないのはなぜですか?ほかのすべてのスレッドが完了する前にメインスレッドを終了したくないだけです。すべてのtidsでjoinを呼び出すだけでそれが可能です。 – Stan

+0

すべてのダウン投票ではどうなっているのですか? – Nick

答えて

1

業界標準とは思われません。

あなたが持っているものは、メインスレッドを実行するための完全に許容される方法です。しかし、ループから脱出する方法を含めることができます。

他の方法には、次のとおりです。

  • joinコマンドを使用して完了するために、すべてのワーカースレッドを待っています。
  • メインスレッドのeventを待っています。ループを終了するように通知できます。
  • メインスレッドを使用して、現在ワーカースレッドによって実行されている処理の一部を実行します。
  • ブーリアンフラグを定期的にチェックして、終了するかどうかを決定します。

最終日には、特定の要件によって異なります。

+0

なぜdownvote? – Nick

+0

編集した質問を参照してください(私はdownvoteしませんでした) – AMCoder

+0

あなたがしたいことは、スレッドを実行したままにしておけば、あなたが持っているものに間違いはありません。クリーンに終了する(プロセスの終了を経由しない)場合は、現在のソリューションにはない方法を実行する必要があります。 – Nick

2

私は他人の終了を待って、あなたのメインスレッドを持っているあなたをお勧めしたい:あなたはPOSIXスレッドを使用している

int main() { 
    // start threads 
    for(thread *t : threads) { 
    join(t); 
    } 
    // finalize everything or restart the thread 
    return 0; 
} 

場合は、pthread_join機能は、これを行います。

+0

編集された質問を参照してください。 – AMCoder

3

。部分的にLinux Daemon Writing HOWTOから撮影、私はあなたがこのような何かしたいと仮定します。メインプロセスは終了します

int main() { 
    pid_t pid; 

    /* Fork off the parent process */  
    pid = fork(); 
    if (pid < 0) { 
      exit(EXIT_FAILURE); 
    } 
    /* If we got a good PID, then 
     we can exit the parent process. */ 
    if (pid > 0) { 
      exit(EXIT_SUCCESS); 
    } 
    // now start threads & do the work 

    for(thread *t : threads) { 
      join(t); 
    } 

    return 0; 
} 

この方法は、子プロセスは、仕事をするスレッドを起動します。最後に、子プロセスは、それらのスレッドが終了して自身を終了するのを待ちます。

+0

+1:O.P.が「WaitForSingleObject」について話していることを除いて、彼がWindowsプラットフォーム上にいることを示唆しています。 – Nick

+0

@ニックあなたは正しいです、私は気づいていたはずです。私は他の誰かのために残したいと思うが、同様のことをCreateProcessで行うことができると思う:-) – Stan

関連する問題