pthread_join()
main() から 100 以上のスレッドを作成するので、main()を終了する前に呼び出す必要があるかどうかを知りたいだけです。また、これらのスレッドによって生成されたデータは必要ありません。基本的に、すべてのスレッドは main() や他のスレッドとは独立して何らかのジョブを実行しています。
7 に答える
pthread_join
次の 2 つのことを行います。
- スレッドが終了するまで待ちます。
- スレッドに関連付けられているすべてのリソースをクリーンアップします。
参加せずにプロセスを終了すると、(2) OS によって実行されます (ただし、スレッド キャンセルのクリーンアップは実行されませんが、軌道からスレッドを削除するだけです)。(1) は実行されません。したがって、呼び出す必要があるpthread_join
かどうかは、(1) が発生する必要があるかどうかによって異なります。
スレッドを実行する必要がない場合は、他の人が言っているように、スレッドを切り離したほうがよいでしょう。分離されたスレッドは結合できません (そのため、完了を待つことはできません) が、完了した場合、そのリソースは自動的に解放されます。
終了すると、他のすべてのスレッドとリソースが自動的にクリーンアップされるため、参加する必要はありません。これは、終了時にすべてのスレッドを実際にmain
強制終了することを前提としています。
スレッドと結合する必要がない場合は、スレッドをpthread_attr_setdetachstate
作成する前に on 属性を使用して、スレッドを「切り離された」スレッドとして作成できます。切り離されたスレッドは結合できませんが、結合する必要もありません。
そう、
プログラムが終了する前にすべてのスレッドを完了させたい場合は、メインスレッドから参加することでこれが機能します。
別の方法として、スレッドを切り離して作成し、
main
すべてのスレッドが終了した後に復帰し、セマフォまたはミューテックス + 条件変数を使用して調整することもできます。すべてのスレッドを完了する必要がない場合は、単にメインから戻ります。他のすべてのスレッドは破棄されます。スレッドを切り離されたスレッドとして作成することもできます。これにより、リソースの消費を抑えることができます。
デフォルトでは、pthreads ライブラリのスレッドは結合可能として作成されます。
ただし、スレッドが切り離されて、結合できなくなる場合があります。親が wait() を呼び出すまでプロセスがリソースを消費するように、スレッドは参加するまでシステム リソースを消費するため、参加する予定のないスレッドは切り離す必要があります。
もちろん、メイン ルーチンが終了すると、すべてのスレッド リソースが解放されます。
それ(デタッチ)に失敗した場合、スレッドが終了すると、ゾンビプロセスと同等のスレッドが生成されます。システム リソースの浪費は別として、スレッド ゾンビが十分に蓄積されると、追加のスレッドを作成できなくなります。
デフォルトでは、スレッドはアタッチされて実行されます。つまり、必要なリソースは、スレッドが結合されるまで使用され続けます。
あなたの説明のように、スレッド自体がスレッドのリソースを必要とする人は誰もいないので、スレッドを切り離して作成するか、スレッドを開始する前にスレッドを切り離すことができます。
スレッドの作成後にスレッドをデタッチするには、 を呼び出しますpthread_detach()
。
とにかく、プログラムが終了する前にすべてのスレッドがなくなっていることを確認したい場合は、メインスレッド (プログラム) を離れる前に、接続されているスレッドを実行してそれらに参加する必要があります。
スレッドが実際に終了したことを確認したい場合は、 を呼び出しますpthread_join
。
そうしないと、プログラムを終了すると、未完了のスレッドがすべて突然終了します。
とはmain
いえ、終了するまで十分に長く待つことができます。しかし、それで十分であることをどのように確認できますか?
メインが終了すると、アプリケーションが終了し、スレッドが終了します... したがって、スレッド結合を使用する (または代わりにフォークを使用する) 必要があります。