pthread_atfork() を使用すれば、fork1 モデルを使用したときのデッドロックが防止されます。
#include <pthread.h> int pthread_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void) );
pthread_atfork() 関数は、fork() を呼び出したスレッドのコンテキストで fork() の前後に呼び出される fork のハンドラを宣言します。
prepare ハンドラは fork() の起動前に呼び出されます。
parent ハンドラは fork() の復帰後に親の中で呼び出されます。
child ハンドラは fork() の復帰後に子の中で呼び出されます。
これらのどれでも NULL に設定できます。連続する pthread_atfork() 呼び出しの順序が重要です。
たとえば、prepare ハンドラが、必要な相互排他ロックをすべて獲得し、次に parent ハンドラと child ハンドラがそれらを解放するといった具合です。このようにすると、プロセスが fork される「前」に、関係するロックがすべて fork 関数を呼び出すスレッドによって保持されるので、子プロセスでのデッドロックが防止されます。
汎用 fork モデルを使用すれば、「fork1 モデルにおける安全性の問題とその解決策」で述べたデッドロックの問題は回避されます。