多线程编程指南

每线程报警

在 Solaris 2.3 和 2.4 发行版中,对 alarm(2) 或 setitimer(2) 的调用仅在调用 LWP 中有意义。LWP 创建终止时,将自动删除这类计时器。由于此行为,只有 alarm()setitimer() 可以使用绑定线程。

即使限于使用绑定线程,Solaris 2.3 和 2.4 多线程应用程序中的 alarm()setitimer() 计时器也不可靠。特别是,在从发出这些调用的绑定线程屏蔽信号方面,alarm()settimer() 计时器不可靠。如果不需要这类屏蔽,则这两个系统调用可在绑定线程中可靠地工作。

在 Solaris 2.5 发行版中,调用 alarm() 时,与 -lpthread (POSIX) 线程链接的应用程序将获取每个进程传送的 SIGALRMalarm() 生成的 SIGALRM是针对进程生成,而不是针对特定 LWP 生成。另外,进程终止时,将重置报警。

使用 Solaris 2.5 之前的发行版编译的应用程序或没有与 -lpthread 链接的应用程序将继续查看每个 LWP 传送的信号,这些信号是由 alarm()setitimer() 生成的。

alarm()setitimer(ITIMER_REAL) 的调用将导致生成的 SIGALRM 信号被发送到进程(从 Solaris 9 发行版开始生效)。