2

私は、マルチスレッドに pthreads を使用する C++ プロジェクトに取り組んでいますが、時々必要にforkなります。コード内に散らばっいる、メモリ割り当てforkは. ポイントをまとめました:

  1. メイン スレッドforkが s の場合、他のスレッドは何らかのライブラリ関数呼び出しの途中である可能性があります。forking は他のスレッドをコピーしないため、呼び出しが永久に停止します。

  2. mallocグローバル変数を使用し、ロックを使用してスレッド セーフを実現します。そのため、親プロセスのスレッドの 1 つがmalloc呼び出しの途中にある場合、forked 子プロセスは事実上、malloc呼び出しが永久にスタックし、回復することはありません。printf等についても同様です。

これは、この記事では言及されていない用語であるreentrancyと関係があることに気付きました。クレームは次のものと同等のようです。

  1. f 親プロセスのメイン スレッドから非エントラント関数を呼び出した場合、子プロセスは を呼び出すことができませんf

  2. malloc再入不可です。

これは正しいですか? 再入可能関数はすべてforking 後に安全に使用できますか? それとも、pthreads と従来の UNIX プロセス モデルがどのように相互作用するかについて、厄介な部分をまだ見逃しているのでしょうか?

私が正しければ、別の質問があります:mallocは再入不可であることが知られていますが、C++ の はnewどうですか? 関連する結果はあまりありませんでしたが(ほとんどの場合、正しい「新しい」をヒットするのが難しいためです:)、再入可能なクレームnew 少なくとも1つあります。C++ 標準ライブラリ全体に関する関連する質問もありますが、満足のいく答えはありません。

PS。興味のある人にとっては、C++ プロジェクトはfish shellです。シェルには必ずフォークが必要であり、応答性を向上させるためにスレッドが採用されています。

4

1 に答える 1

2

@cnicutarが指摘しているように、この記事では、fork後にasync-safe関数を呼び出すことができると述べています。また、この記事によると、リエントラント関数は常に非同期ではないため(ただし、その逆ではありません)、fork後に安全に呼び出すことができます。

これで私の主な質問は終わりです。別のスレッドで追加の質問をします(しゃれは意図されていません)。

更新:ここで追加の質問をしました。

于 2012-12-30T11:59:05.177 に答える