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

スレッドごとのアラーム

Solaris オペレーティング環境 2.3 と 2.4 リリースでは、alarm(2) または setitimer(2) の呼び出しは、呼び出し LWP の中だけで意味をもっていました。生成した LWP が終了すると、こうしたタイマは自動的に削除されました。このため、alarm()setitimer() を使用できるスレッドは、結合スレッドに限られていました。

さらに制限された使用方法でも、Solaris オペレーティング環境 2.3 と 2.4 のマルチスレッドアプリケーションでの alarm() タイマと setitimer() タイマは、これらの呼び出しを行なった結合スレッドからのシグナルのマスキングについて信頼性に欠けるところがありました。このようなマスキングが必要とされなければ、結合スレッドから出された、これら 2 つのシステムコールの動作は信頼できるものでした。

Solaris オペレーティング環境 2.5 以降のリリースでは、-lpthread (POSIX) スレッドとリンクしたアプリケーションは、alarm() を呼び出したときにプロセスごとの SIGALRM 通知を受けるようになります。alarm() で生成される SIGALRM は、特定の LWP に向けられるのではなく、そのプロセスに対して生成されます。このアラームは、そのプロセスの終了時にリセットされます。

Solaris オペレーティング環境 2.5 リリースより前のリリースでコンパイルされたアプリケーション、あるいは -lpthread とリンクされていないアプリケーションは、alarm() または setitimer() で生成されるシグナルの、LWP ごとの送信を引き続き行います。

将来のリリースでは、ITIMER_REAL フラグを指定した alarm() または setitimer() の呼び出しによって、SIGALRM がそのプロセスに送られる予定です。他のフラグについては、setitimer() で引き続き LWP ごとの送信が行われる予定です。setitimer() のフラグで ITIMER_REAL フラグ以外のものについては、生成されるシグナルが、その呼び出しを行なった LWP に送信されることに変わりはなく、したがって結合スレッドからしか使用できません。