pthreads を使用する C++ で、スレッドの 1 つが fork を呼び出した場合、他のスレッドはどうなりますか?
スレッドがたどっていないようです。私の場合、デーモンを作成しようとしていて、親が終了して fork() を使用してそれをデーモン化します。ただし、コードの新しいパスでは、フォークの前と後にいくつかのスレッドを作成します。フォーク後にすべてのスレッド作成を移動するのではなく、スレッドの所有権を新しいフォークされたプロセスに変更する簡単な方法はありますか?
pthreads を使用する C++ で、スレッドの 1 つが fork を呼び出した場合、他のスレッドはどうなりますか?
スレッドがたどっていないようです。私の場合、デーモンを作成しようとしていて、親が終了して fork() を使用してそれをデーモン化します。ただし、コードの新しいパスでは、フォークの前と後にいくつかのスレッドを作成します。フォーク後にすべてのスレッド作成を移動するのではなく、スレッドの所有権を新しいフォークされたプロセスに変更する簡単な方法はありますか?
何もない。fork() を呼び出すスレッドのみが複製されます。子プロセスは、新しいスレッドを開始する必要があります。親スレッドはそのままにします。
POSIX では、マルチスレッド プロセスが fork すると、子プロセスは親プロセスのコピーとまったく同じように見えますが、すべてのスレッドが途中で停止して消えてしまいます。
スレッドがロックを保持している場合、これは非常に悪いことです。
このため、pthread_atfork
この状況のハンドラーを登録できる大まかなメカニズムが呼び出されます。
ミューテックスを使用する適切に作成されたプログラム モジュール (および特に再利用可能なミドルウェア) はpthread_atfork
、プロセスがfork
.
ミューテックス ロックに加えて、スレッドは他のリソースを持つことができます。たとえば、そのスレッドだけがアクセスできる、スレッド固有のデータを追い払うpthread_setspecific
ことができます (スレッドは、デストラクタを介してそれをクリーンアップする責任があります)。
子プロセスでは、そのようなデストラクタは実行されません。アドレス空間はコピーされますが、スレッドとそのスレッド固有の値がそこにないため、子でメモリがリークします。これはpthread_atfork
ハンドラーでも処理できますし、処理する必要があります。
通常、スレッドをフォークするのは非常に悪いことです。フォークされたプロセスは、そうでないスレッドを除いて、親の完全なコピーであると想定されています。pthread_atfork()
時々役立つ機能があります。スレッドをフォークする必要がある場合は、exec()
の直後に呼び出すのが最善ですfork()
。
fork()
およびのドキュメントで POSIX 開発者からの警告を読むことをお勧めしますpthread_atfork()
( http://pubs.opengroup.org/onlinepubs/007904975/functions/fork.htmlおよびhttp://pubs.opengroup.org/onlinepubs/007904975を参照)。 /functions/pthread_atfork.html )。
fork()
ドキュメントから:
したがって、
fork()
関数は新しいプログラムを実行するためだけに使用され、関数の呼び出しと関数の呼び出しの間に特定のリソースを必要とする関数を呼び出した場合の影響fork()
はexec
定義されていません。
新しいプロセスを実行しているスレッドによってプリエンプションされない限り、何もありません。