中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
C++程序中如何为两个独立的线程设置互不干扰的定时器?
作者:未知 时间:2005-09-13 19:25 出处:ChinaUnix.net 责编:chinaitpower
              摘要:C++程序中如何为两个独立的线程设置互不干扰的定时器?

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有