現在のプロセス内の他のスレッドは、フォークによって殺されません。それらはまだそこにあり、親プロセスで実行されています。現在のプロセスでは、 fork
は1つのスレッドのみをフォークし、親プロセス内のすべての非スレッドリソースのコピーを持つ1つのスレッドを実行する新しいプロセスを作成するという問題があります。
あなたが望むのは、マルチスレッド・タスク全体を複製し、その中のすべてのスレッドをフォークし、同じ数のスレッドで新しいプロセス/タスクを作成する方法です。
THATを実行するには、プロセス内の他のスレッドをすべて見つけて一時停止し、現在の状態(保持しているすべてのロックを含む)をダンプし、新しいプロセスをforkしてから、その子は、必要に応じて新しい子スレッドを参照するためにロック状態を再配線します。
残念なことに、POSIXのpthreadインタフェースは絶望的に指定されておらず、その方法を提供していません。特に、実際に実行されているスレッドを把握できるように、あらゆる種類のリフレクションインターフェイスが欠けています。
とにかくこれをやりたければ、私はこれにアプローチしようとする2つの方法を見ることができます:
-
/proc/self/taskを突き止めて、プロセス内でどのスレッドが実行されているかを把握し、おそらく、内部状態を取得するために他のスレッドをptrace(2)する必要があります。これは非常に難しいでしょう。
pthreadsライブラリをラップする - ライブラリを直接使うのではなく、すべての呼び出しを傍受し、作成されるすべてのスレッド/ mutexes/locksを追跡して、フォークするときにその情報を利用できるようにする。これは、pthreadsを使用するサードパーティのライブラリを使用したくない限り、うまく動作します。
2番目のオプションははるかに簡単で(やや移植性がありますが)、アプリケーション全体のすべてのソースコードにアクセスできる場合にのみうまく動作し、ラッパーを適切に使用するように変更できます。