web-dev-qa-db-ja.com

pthread_join()を呼び出す必要がありますか

Main()から100を超えるスレッドを作成しているので、main()を終了する前にpthread_join()を呼び出す必要があることを知りたかっただけです。また、これらのスレッドによって生成されたデータは必要ありません。基本的に、すべてのスレッドはmain()や他のスレッドから独立して何らかのジョブを実行しています。

13
nav_jan

pthread_joinは2つのことを行います。

  1. スレッドが終了するのを待ちます。
  2. スレッドに関連付けられているすべてのリソースをクリーンアップします。

参加せずにプロセスを終了すると、(2)OSによって自動的に実行され(スレッドキャンセルのクリーンアップは実行されませんが、軌道からスレッドを削除するだけです)、(1)実行されません。したがって、pthread_joinを呼び出す必要があるかどうかは、(1)を呼び出す必要があるかどうかによって異なります。

スレッドを実行する必要がない場合は、他の人が言っているように、スレッドを切り離したほうがよいでしょう。切り離されたスレッドは参加できません(したがって、その完了を待つことはできません)が、完了すると、そのリソースは自動的に解放されます。

27
Steve Jessop

終了すると、他のすべてのスレッドとリソースが自動的にクリーンアップされるため、参加する必要はありません。これは、mainが終了したときにすべてのスレッドを実際に強制終了することを前提としています。

スレッドと結合する必要がない場合は、スレッドを作成する前に、属性でpthread_attr_setdetachstateを使用して、スレッドを「切り離された」スレッドとして作成できます。切り離されたスレッドは結合できませんが、結合する必要はありません必要

そう、

  1. プログラムが終了する前にすべてのスレッドを完了させたい場合は、メインスレッドから参加するとこれが機能します。

  2. 別の方法として、スレッドをデタッチとして作成し、すべてのスレッドが終了した後にmainから戻り、セマフォまたはミューテックス+条件変数を使用して調整することができます。

  3. すべてのスレッドを完了する必要がない場合は、メインから戻るだけです。他のすべてのスレッドは破棄されます。スレッドをデタッチスレッドとして作成することもできます。これにより、リソースの消費を減らすことができます。

2
Dietrich Epp

デフォルトでは、スレッドは接続されて実行されます。つまり、スレッドが結合されるまで、必要なリソースが使用され続けます。

あなたの説明からわかるように、スレッド自体がスレッドのリソースを必要とするので、スレッドを開始する前に、スレッドをデタッチするか、デタッチすることができます。

スレッドの作成後にスレッドをデタッチするには、pthread_detach()を呼び出します。

とにかく、プログラムが終了する前にすべてのスレッドがなくなったことを確認したい場合は、接続されたスレッドを実行し、メインスレッド(プログラム)を離れる前にそれらを結合する必要があります。

1
alk

デフォルトでは、pthreadsライブラリのスレッドは結合可能として作成されます。

ただし、スレッドが切り離されて、結合できなくなる場合があります。スレッドは参加するまでシステムリソースを消費するため、プロセスが親がwait()を呼び出すまでリソースを消費するのと同様に、参加する予定のないスレッドはデタッチする必要があります。これはプログラミングの良い習慣です。

もちろん、メインルーチンが終了すると、すべてのスレッドリソースが解放されます。

それを怠ると(デタッチ)、スレッドが終了すると、ゾンビプロセスと同等のスレッドが生成されます。システムリソースを浪費する以外に、十分な数のスレッドゾンビが蓄積されると、追加のスレッドを作成できなくなります。

1

はい、スレッドがアタッチ可能である場合、pthread_joinは必須であり、そうでない場合はゾンビスレッドを作成します。

上記の回答に同意し、pthread_joinのmanページからのメモを共有するだけです。

ノート

   After a successful call to pthread_join(), the caller is guaranteed that the target thread has terminated.

   Joining with a thread that has previously been joined results in undefined behavior.

   Failure to join with a thread that is joinable (i.e., one that is not detached), produces a "zombie thread".  Avoid doing this, since each zombie thread consumes some  system  resources,  and  when
   enough zombie threads have accumulated, it will no longer be possible to create new threads (or processes).
1
Shahid Hussain

スレッドが実際に終了したことを確認したい場合は、pthread_joinを呼び出します。

そうしないと、プログラムを終了すると、未完了のスレッドがすべて突然終了します。

そうは言っても、mainは終了するまで十分長い時間待つことができます。しかし、それでは、どうすればそれが十分であることを確認できますか?

0
Didier Trosset