JohnBull 回复于:2003-08-26 10:27:01 |
并不是setitimer有bug,而是setitimer和内核的机制决定了它是线程不安全的。我看可以用进程了,或者写一个定时器服务线程,统一安排所有的定时器。 |
myzhai 回复于:2003-08-26 10:41:09 |
能否再说得详细一些?
谢谢 |
deathbravo 回复于:2003-08-26 13:58:40 |
setitimer调用在线程中确实有bug,是线程不安全的。
setitimer设置的定时器是与线程所处的LWP相关的,也就是说SIGALRM应该是送给LWP的,如果你的线程是非绑定线程的话,那么SIGALRM产生时也许调用setitimer函数的线程不在这个LWP里面,SIGALRM信号就进错门了。 大概就是这个意思了吧,man page里是这么说的。不知道我说明白没有。 实在想用的话就要用绑定线程。 不过文档里面说在以后的版本里面setitimer会改成进程范围的,和alarm一样了。 |
东子 回复于:2003-08-26 20:54:59 |
作2个定时器,一个产生sigalrm信号,一个产生sigusr信号
然后在信号触发程序中对这2个信号作同样的处理,不是相当于互不干扰的定时器吗?我觉得这样可行。 |
Mike2003 回复于:2003-08-26 23:35:55 |
Solaris 支持LWP范围内的定时器。但很多因素会影响SIGALRM是否送到LWP还是process,例如使用POSIX thread编译时的宏定义,setitimer调用时的参数等。你最好查一下manual。 |
albcamus 回复于:2005-04-12 15:23:12 |
把别人2年前的帖子顶起来,因为我也遇到这个问题了,想想办法先。。 |