マルチスレッド環境に関連する問題については、 pthread_atfork、特に RATIONALE セクションを参照してください。また、子と親のfork
前後で何が有効であるかについてのヒントも提供します。fork
更新: RATIONALE セクションは非規範的であり、標準の他の部分と矛盾していることが判明しました。詳細については、Dave Butenhof によるこの欠陥レポートを参照してください。
直後は、マルチスレッド プログラム (つまり、ミューテックスを保持しているスレッド) のどの状態でも安全であると想定されていますexec
。と の間でfork
考えられることに関しては、状況は複雑です。fork
exec
最も重要なことは、1 つのスレッド ( を呼び出したスレッドfork
) だけが子プロセスで複製されることです。したがって、その時点で別のスレッドによって保持されているミューテックスはfork
永久にロックされます。つまり、(非プロセス共有ミューテックスを想定して) 子プロセス内のそのコピーは、ロックを解除するスレッドがないため、永久にロックされます。
後でミューテックスを解放fork
することは、可能であれば安全です。つまり、最初にfork
ing スレッドがミューテックスを所有している場合です。通常、ハンドラは次のようpthread_atfork
に動作します: の前にミューテックスfork
をロックし、子でロックを解除し、親でロックを解除します。
fork の前にプロセスが所有していたミューテックスを取得した時点で (子のアドレス空間内のコピーについて説明したことを思い出してください): ing スレッドによって所有されていた場合、それはfork
再帰ロックです ( に対して機能しPTHREAD_MUTEX_RECURSIVE
ます)。別のスレッドが所有していた場合、永久にロックされたままになり、再取得できなくなります。
適切なハンドラを登録することにより、サードパーティ ライブラリは と の間でpthread_atfork
安全に使用できることを保証できます。(汎用ライブラリではなく、主にプログラミング言語ランタイムから期待されます)。fork
exec
さらに調査した後、 に依存することは避け、 と の間の async-signal-safe 呼び出し以外は何もしないことをお勧めしますpthread_atfork
( /を放棄することはさらに良いでしょう)。fork
exec
fork
exec
posix_spawn
問題は、fork
それ自体がシグナルハンドラーで呼び出される可能性があることです。pthread_atfork
その RATIONALE がミューテックスのロック解除と子プロセスでのスレッドの再作成 (!) を明示的に言及している場合でも、それは の重要な使用を排除します。
考えられるさまざまな解釈の「灰色の領域」が残っていると思います。
- シグナル ハンドラを呼び出さないことがわかっ
pthread_atfork
ているプログラム内のハンドラの場合。fork
- シグナルハンドラーにない
fork
呼び出しの周りで発生する非 pthread-atfork アクションの場合。
しかし、どの読み取り値がポータブル アプリケーションに使用されるかは明らかです。