スレッドを作成するために呼び出しpthread_create()
た場合、メイン プロセスが終了してもこのスレッドを存続させるにはどうすればよいですか?
7 に答える
それは不可能。プロセスはスレッドで構成され、スレッドは単独では存在できません。
ただし、「メイン プロセスが終了しました」ではなく「メイン スレッドが終了しました」という意味である場合は、pthread_exit を呼び出さずに main() が終了する場合について、以下の最後の説明を参照してください。この場合、すべてのスレッドが暗黙的に終了します。main() が終了前に pthread_exit を呼び出した場合、メイン スレッドのみが終了し、作成された他のスレッドは引き続き実行されます。
スレッドを終了する方法はいくつかあります。
- スレッドは、開始ルーチンから正常に戻ります。作業完了です。
- スレッドは、作業が完了しているかどうかに関係なく、pthread_exit サブルーチンを呼び出します。
- スレッドは、pthread_cancel ルーチンを介して別のスレッドによってキャンセルされます。
- exec() または exit() の呼び出しにより、プロセス全体が終了します。
- pthread_exit 自体を明示的に呼び出さずに main() が最初に終了した場合
main
プロセスが終了した後にスレッドをアクティブにすることはできません。ただし、 insidepthread_exit(..)
の代わりに使用すると、他のスレッドが終了するのを待つことができます。これにより、メインスレッドは終了しますが、他のスレッドは引き続き実行されます。exit(..)
main(..)
の詳細については、このリンクpthread_exit()
にアクセスしてください。
スレッドをデタッチすると、デタッチされた最後のスレッドが終了するまでプロセスは実際には終了しませんが、デタッチされたスレッドのみが実行されます。
を使用してスレッドを切り離すことができますpthread_detach
。
ただし、これが機能するには、メイン スレッド (main
関数を実行しているスレッド) を終了する必要がpthread_exit
ありますexit
。
メインプロセスが終了しても、スレッドを存続させることはできません。スレッドはメイン プロセスの一部であり、同じリソースを使用するため、メイン プログラムが終了すると、そのリソースも解放されます。そのため、プロセスの終了後にスレッドが生きていることはできません。
スレッドはプロセスの「下」で実行されます。main()
コードはスレッドで実行されます。main() (または他のスレッド) で作成する他のスレッドは、同じプロセスで実行されます。
main()
現在同じプロセスで実行されている他のスレッドに参加するのを待たずに、スレッドを終了させることができるはずです。ただし、私は主に Windows を使用しており、これを *nix システムで実行したことはありません。
これを行う場合は、終了する前に各スレッドがそのリソースを解放していることを確認してください。
できることは、main() を終了しないことです。main での処理の最後に、そうでなければ終了するところで、次のように入力します。
int main(void) {
...
...
while (1) sleep(10);
return (0);
}
...または同様のもの。プロセスは、プロセス内で生成されたすべてのスレッドのコンテナーであり、スレッドが存在し続けるために存在する必要があります。他のスレッドが引き続き実行されるように、main() スレッドを存続させても害はありません。