3

いくつかのことをしたり、いくつかのポートをリッスンしたりするいくつかのスレッドを開始するプロセスがあります。

すべてのスレッドを開始した後、メイン スレッドは現在無限ループに入ります。

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

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

エクストラsleepは、メインスレッドがプロセッサを消費しないことを保証します。

このアプローチは大丈夫ですか?プロセスを維持する方法に関する業界標準はありますか? ありがとう。

編集:いくつかの説明:

  • スレッドはリスナーであるため、joinorWaitForSingleObjectはオプションではありません。通常はここで join を使用できますが、スレッドは 3 番目のクライアント ライブラリによって開始され、私には制御できません。
  • メインスレッドで何らかの処理を行うことは、設計の観点からは意味がありません。
4

3 に答える 3

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;
}

このようにしてメインプロセスが終了し、子プロセスが作業を行うスレッドを生成します。最後に、子プロセスはそれらのスレッドが終了するのを待ってから終了します。

于 2012-05-01T08:15:35.107 に答える
2

メインスレッドを他のスレッドの終了を待機させることをお勧めします。

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

POSIX スレッドを使用している場合、pthread_join関数はこれを行います。

于 2012-05-01T07:53:15.213 に答える
1

業界標準があるとは思えません。

あなたが持っているのは、メインスレッドを実行する完全に受け入れられる方法です。ただし、ループから抜け出す方法を含めたい場合があります。

その他の方法には次のものがあります。

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

結局のところ、それはあなたの特定の要件に依存します。

于 2012-05-01T07:52:04.973 に答える