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

LWP ごとの POSIX タイマー

Solaris 2.3 と 2.4 リリースでは、timer_create(3RT) 関数が戻すタイマーオブジェクトは、そのタイマー ID が呼び出し LWP の中だけで意味をもち、その期限切れシグナルが呼び出し LWP に送られるというものでした。このため、POSIX タイマ機能を使用できるスレッドは、結合スレッドに限られていました。

さらに、この制限された使用方法でも、Solaris 2.3 と 2.4 リリースのマルチスレッドアプリケーションでの POSIX タイマーは、生成されるシグナルのマスキングおよび sigvent 構造体からの関連値の送信について信頼性に欠けるところがありました。

Solaris 2.5 以降のリリースでは、マクロ _POSIX_PER_PROCESS_TIMERS を定義してコンパイルされたアプリケーション、あるいはシンボル _POSIX_C_SOURCE に対して 199506L より大きな値を指定してコンパイルされたアプリケーションは、プロセスごとのタイマーを作成できます。

Solaris 9 オペレーティング環境では、仮想時間およびプロファイルのインターバルタイマーを除いて、すべてプロセスごとのタイマーが使用されます (ITIMER_VIRTUALITIMER_PROF については setitimer (2) を参照)。仮想時間およびプロファイルのタイマーは、LWP ごとになっています。

プロセスごとのタイマーのタイマー ID は、どの LWP からでも使用できます。期限切れシグナルは、特定の LWP に向けられるのではなく、そのプロセスに対して生成されます。

プロセスごとのタイマーは、timer_delete(3RT) の呼び出し時またはそのプロセスの終了時にのみ削除されます。