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

スレッドの選択 — Solaris または POSIX

Solaris での pthread の実装は、Solaris スレッドと完全に互換性があります。同じアプリケーションで Solaris スレッドと pthread の両方を使用できます。各スレッド実装の相違点については、pthreads(5) のマニュアルページを参照してください。また、相違点については、このマニュアルの第 6 章Solaris スレッドを使ったプログラミングも参照してください。

スレッドの相違点の 1 つに、fork 関数の動作があります。

Solaris 9 リリースでは、fork() 関数の動作は、アプリケーションが POSIX スレッドライブラリにリンクされているかどうかによって決定されていました。-lthread (Solaris スレッド) にリンクされ、-lpthread (POSIX スレッド) にリンクされていない場合は、fork() によって、親プロセスのすべてのスレッドが子スレッド内に複製されました。アプリケーションが -lpthread にリンクされている場合は、-lthread にもリンクされかどうかには関係なく、fork()fork1() と同じであり、呼び出しスレッドのみが複製されました。

Solaris 10 リリースからは、forkall() 関数の呼び出しによって、親プロセスのすべてのスレッドが子プロセス内に複製されるようになりました。fork1() の呼び出しによって、呼び出しスレッドのみが子プロセス内に複製されます。Solaris 10 リリースでは、fork() の呼び出しは fork1() の呼び出しと等価です。つまり、呼び出しスレッドのみが子プロセス内に複製されます。これが、fork() に対して POSIX で規定されている動作です。アプリケーションで、すべての fork セマンティクスを複製する必要がある場合は、forkall() を呼び出してください。