C++程序中如何为两个独立的线程设置互不干扰的定时器?

发表于:2007-05-25来源:作者:点击数: 标签:线程程序何为中如独立
C++程序有两个独立的线程A和B,希望在A和B中分别设置一个定时器(定时器结束时发一个SIGA LR M信号),且互不干扰。目前的做法是在每个线程中使用一个setitimer调用,但发现两个线程中的setitimer调用互相干扰,不会分别完成定时任务(有贴子讲setitimer调用

C++程序有两个独立的线程A和B,希望在A和B中分别设置一个定时器(定时器结束时发一个SIGALRM信号),且互不干扰。目前的做法是在每个线程中使用一个setitimer调用,但发现两个线程中的setitimer调用互相干扰,不会分别完成定时任务(有贴子讲setitimer调用在线程中有bug)。请问各位,哪如何实现为两个独立的线程设置互不干扰的定时器?
谢谢!

 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年前的帖子顶起来,因为我也遇到这个问题了,想想办法先。。

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)