Sun Studio C コンパイラ (cc) には、マルチスレッドコードのコンパイルとリンクを行うための -mt オプションが用意されています。-mt オプションは、ライブラリの適切な順序でのリンクを保証するものです。
-mt オプションは、一貫性をもって使用する必要があります。-mt でのコンパイルとリンクを別のステップで行う場合は、リンクステップとコンパイルステップで -mt オプションを使用する必要があります。1 つの変換ユニットを -mt でコンパイルおよびリンクする場合は、そのプログラムのすべてのユニットを -mt でコンパイルおよびリンクする必要があります。
Solaris 10 リリースと Solaris 9 リリースのコンパイルとリンクには同じコマンドを使用できますが、次のいくつかの相違点を考慮するようにしてください。
Solaris 10 リリースでは、すべてのスレッド関数が libc ライブラリに含まれているため、明示的に libthread または libpthread ライブラリにリンクする必要はありません。
Solaris 9 リリースでは、Solaris スレッドの API と pthread の API が別のライブラリ libthread と libpthread に含まれています。Solaris 10 には、libc.so.1 に対するフィルタとして libthread.so と libpthread.so の共有オブジェクトが実装されているため、Solaris 9 で別のライブラリを使用してコンパイルされたアプリケーションでも動作するはずです。アプリケーションが明示的に libthread または libpthread ライブラリにリンクされている場合は、Solaris 10 でコンパイルされたアプリケーションは Solaris 9 でも動作します。-mt でリンクすると、アプリケーションを Solaris 9 で実行したとき、Solaris の fork() と fork1() の区別が保持されます。-lpthread オプションでリンクすると、fork() は、Solaris 9 以前のリリースでの Solaris fork1() の呼び出しと同じ動作をします。
Solaris 9 リリースでは、アプリケーションが lthread または lpthread にリンクされていない場合、-libthread と -libpthread のすべての呼び出しが無効です。実行時ライブラリ libc には、libthread と libpthread 内の関数の仮エントリが NULL 手続きとして数多く定義されています。本当の手続きは、libc とスレッドライブラリ (libthread または libpthread) の両方がアプリケーションにリンクされたときに、そのスレッドライブラリによって挿入されます。
Solaris 9 以降のリリースでは、スレッドを使用しないプログラムをリンクするときに、-mt、-lthread または -lpthread を指定しても、意味上の違いは発生しません。余分なスレッドや LWP が生成されることはありません。メインスレッド (唯一のスレッド) が、従来のシングルスレッドプロセスとして実行されます。プログラムへの唯一の影響は、システムライブラリのロックが空の関数の呼び出しではなく本当のロックになる点です。競合しないロックを獲得する必要があります。
アプリケーションで pthread のみを使用するか、または Solaris スレッドと pthread の両方を使用している場合は、次のコマンドを使用してコンパイルとリンクを行います。
cc -mt [ flag ... ] file... [ library... ] -lpthread |
-mt オプションが libthread ライブラリにリンクするに対して、-lpthread オプションは libpthread ライブラリにリンクします。libpthread によって libthread へのインタフェースが提供されるため、pthread を使用する場合は両方のフラグが必要です。
-mt オプションは、コマンド行の任意の場所に指定できます。-lpthread オプションは、ユーザーライブラリのあとに指定するようにします。-mt と -lpthread の相対位置は関係ありません。
たとえば、次の行はすべて等価です。
cc -mt -o myprog f1.o f2.o -lmylib -lpthread cc -o myprog f1.o f2.o -mt -lmylib -lpthread cc -o myprog f1.o f2.o -lmylib -mt -lpthread cc -o myprog f1.o f2.o -lmylib -lpthread -mt
cc コマンドのオプションの詳細については、Sun Studio cc(1) のマニュアルページおよび『Sun Studio 12: C ユーザーズガイド』を参照してください。
Solaris スレッド環境では、アプリケーションのコンパイルとリンク時に、次のオプションを指定します。
アプリケーションで Solaris スレッドのみを使用している場合は、次のコマンドを使用してコンパイルとリンクを行います。
cc -mt [ flag ... ] file... [ library... ] |
-mt オプションは、libthread ライブラリにリンクします。
cc コマンドのオプションの詳細については、Sun Studio cc(1) のマニュアルページおよび『Sun Studio 12: C ユーザーズガイド』を参照してください。
アプリケーションで pthread と Solaris スレッドの両方の関数を使用している場合は、pthread のみのコンパイルに使用したものと同じコマンドでコンパイルとリンクを行うことができます。
cc -mt [ flag ... ] file... [ library... ] -lpthread |
混用の場合は、thread.h と pthread.h の両方を組み込む必要があります。