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

fork() と Solaris スレッドに関する問題

Solaris 10 リリースより前のリリースでは、Solaris スレッドと POSIX スレッドによる fork() の定義が異なっていました。fork() の問題の詳細は、「プロセスの作成: execexit の問題」を参照してください。

Solaris libthread は、fork()fork1() の両方をサポートしていました。fork() 呼び出しには、「汎用 fork」セマンティクスがあります。fork() は、スレッド、LWPを含めて、プロセス内のすべてを複製し、親の完全なクローンを生成しました。一方、fork1() 呼び出しで作成されるクローンはスレッドを 1 つしかもちませんでした。プロセスの状態とアドレス空間は複製されますが、スレッドについては呼び出しスレッドが複製されるだけでした。

POSIX libpthread は 、fork() のみをサポートしていました。そのセマンティクスは、Solaris スレッドにおける fork1() と同じです。

fork() のセマンティクスが「汎用 fork」と「fork1」のどちらになるかは、どちらのライブラリを使用するかで決まりました。-lthread を使ってリンクすれば、fork() に「汎用 fork」セマンティクスが割り当てられます。-lpthread を使ってリンクすれば、fork() に「fork1」セマンティクスが割り当てられます。

Solaris 10 リリースから、Solaris スレッドと POSIX スレッドの fork() のセマンティクスが共通になりました。つまり、 fork1() セマンティクスが呼び出し側だけを複製するようになりました。すべてを複製するセマンティクスが必要なアプリケーションには、新しい関数 forkall () が提供されています。

詳細は、「マルチスレッドプログラムのコンパイルとリンク」を参照してください。