pthread_join()
で待ちたくないことがわかっている場合は、独立したスレッドを作成します .唯一のパフォーマンス上の利点は、切り離されたスレッドが終了したときに、リソースが解放される前にスレッドが参加するのを待たずに、そのリソースをすぐに解放できることです。
結合可能なスレッドに結合しないことは「合法」です。ただし、(前述のように) スレッドが結合されるまでリソースは解放されないため、通常はお勧めできません。したがって、スレッドに結合しないと、(プログラムが終了するまで) 無期限に拘束されたままになります。
<ブロック引用>
最初から独立したスレッドをいつ作成する必要がありますか?
アプリケーションがそのスレッドがいつ完了するかを気にせず、スレッドの戻り値も気にしないときはいつでも (スレッドは pthread_exit
を介して他のスレッド/アプリケーションに値を通信することができます) ).
たとえば、クライアント/サーバー アプリケーション モデルでは、サーバーは新しいスレッドを作成して各要求を処理する場合があります。ただし、サーバー自体は、スレッドのスレッドの戻り値を気にしません。その場合、分離 を作成するのが理にかなっています
サーバーが保証する必要があるのは、現在処理されているリクエストが完了していることだけです。プログラム/アプリケーション全体を終了せずにメインスレッドを終了するだけで、これを行うことができます。プロセスの最後のスレッドが終了すると、アプリケーション/プログラムは自然に終了します。
擬似コードは次のようになります:
/* A server application */
void process(void *arg)
{
/* Detach self. */
pthread_detach(pthread_self());
/* process a client request. */
pthread_exit(NULL);
}
int main(void)
{
while (not_done) {
pthread_t t_id;
errno = pthread_create(&t_id, NULL, process, NULL);
if (errno) perror("pthread_create:");
}
/* There may be pending requests at this point. */
/* Just exit the main thread - not the whole program - so that remaining
requests that may still be processed can continue. */
pthread_exit(NULL);
}
別の例としては、アプリケーションが実行されている間、一定の間隔で情報をログに記録するデーモンまたはロガー スレッドが考えられます。
<ブロック引用>結合可能なスレッドと比較して、パフォーマンス上の利点はありますか?
パフォーマンスに関しては、joinable との間に違いはありません スレッド vs 分離 スレッド。唯一の違いは、切り離されたスレッドの場合、そのリソース (スレッド スタックや関連するヒープ メモリなど - これらの「リソース」を構成するものは実装固有です) です。
<ブロック引用>結合可能な (デフォルトで) スレッドで pthread_join() を実行しないことは合法ですか?
はい、スレッドに参加しないことは合法です。 pthread_join
必要でない限り、決して使用する必要のない便利な関数です。ただし、作成されたスレッドは結合可能であることに注意してください
参加したい場合の例は、スレッド間で分割された作業の「一部」をスレッドが実行する場合です。その場合、続行する前にすべてのスレッドが完了していることを確認する必要があります。タスク ファームの並列処理が良い例です。
<ブロック引用>それとも、そのようなスレッドは常に pthread_exit() する前に detach() 関数を使用する必要がありますか?
必要はありません。しかし、joinable が必要かどうかを決定したいことがよくあります。 または離れている 作成時のスレッド。
属性 PTHREAD_CREATE_DETACHED
を設定することで、取り外し可能なスレッドを作成できることに注意してください。 pthread_attr_setdetachstate
の呼び出しで 、スレッド決定は、任意の時点で自分自身を切り離すことを決定できます。 pthread_detach(pthread_self())
で .また、スレッド ID (pthread_t
) 別のスレッドの pthread_detach(thread_id);
で切り離すことができます .