マルチスレッドのプログラミング

解決策: pthread_atfork

fork 1 モデルを使用するときは必ず、pthread_atfork() を使ってデッドロックを防ぎます。

#include <pthread.h>

int pthread_atfork(void (*prepare) (void), void (*
parent) (void),
    void (*child) (void) );

pthread_atfork() 関数は、fork() を呼び出したスレッドのコンテキストで fork() の前後に呼び出される fork() のハンドラを宣言します。

すべてのハンドラ引数は NULL に設定できます。連続する pthread_atfork() 呼び出しの順序が重要です。

たとえば、prepare ハンドラが、必要な相互排他ロックをすべて獲得することがあります。次に、parent および child ハンドラがこれらの相互排他ロックを解放することがあります。必要なすべての相互排他ロックを獲得する prepare ハンドラは、プロセスが fork される前に、関連するすべてのロックが、fork 関数を呼び出すスレッドによって保持されているようにする必要があります。この方法で、子プロセスでのデッドロックを防ぐことができます。

詳細は、pthread_atfork(3C) のマニュアルページを参照してください。