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

正しい fork の選択

アプリケーションの中での fork() のセマンティクスが「汎用 fork」と「fork 1」のどちらであるかは、該当するライブラリとリンクすることによって決定されます。-lthread を指定してリンクすると、fork() のセマンティクスは「汎用 fork」になり、-lpthread を指定してリンクすると、fork() のセマンティクスは「fork 1」になります (コンパイルオプションの説明は、図 7-1 を参照してください)。

すべての fork に関係する注意事項

どの fork() 関数についても、呼び出した後で広域的状態を使用するときには注意が必要です。

たとえば、あるスレッドがファイルを逐次的に読み取っているときに同じプロセス内の別のスレッドが fork() 関数を 1 つ呼び出すと、両方のプロセスにファイル読み取り中のスレッドが存在することになります。fork() 後はファイル記述子のシークポインタが共有されるため、親プロセス内のスレッドがデータを読み取ると、子プロセス内のスレッドは残りのデータを読み取ります。この結果、連続読み取りアクセスに切れ目ができます。