私は、マルチスレッドに pthreads を使用する C++ プロジェクトに取り組んでいますが、時々必要にfork
なります。コード内に散らばっている、メモリ割り当てfork
は. ポイントをまとめました:
メイン スレッド
fork
が s の場合、他のスレッドは何らかのライブラリ関数呼び出しの途中である可能性があります。fork
ing は他のスレッドをコピーしないため、呼び出しが永久に停止します。malloc
グローバル変数を使用し、ロックを使用してスレッド セーフを実現します。そのため、親プロセスのスレッドの 1 つがmalloc
呼び出しの途中にある場合、fork
ed 子プロセスは事実上、malloc
呼び出しが永久にスタックし、回復することはありません。printf
等についても同様です。
これは、この記事では言及されていない用語であるreentrancyと関係があることに気付きました。クレームは次のものと同等のようです。
f
親プロセスのメイン スレッドから非エントラント関数を呼び出した場合、子プロセスは を呼び出すことができませんf
。malloc
再入不可です。
これは正しいですか? 再入可能関数はすべてfork
ing 後に安全に使用できますか? それとも、pthreads と従来の UNIX プロセス モデルがどのように相互作用するかについて、厄介な部分をまだ見逃しているのでしょうか?
私が正しければ、別の質問があります:malloc
は再入不可であることが知られていますが、C++ の はnew
どうですか? 関連する結果はあまりありませんでしたが(ほとんどの場合、正しい「新しい」をヒットするのが難しいためです:)、再入可能なクレームnew
が少なくとも1つあります。C++ 標準ライブラリ全体に関する関連する質問もありますが、満足のいく答えはありません。
PS。興味のある人にとっては、C++ プロジェクトはfish shellです。シェルには必ずフォークが必要であり、応答性を向上させるためにスレッドが採用されています。