免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9736 | 回复: 29
打印 上一主题 下一主题

setitimer() && select() [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-11 19:48 |只看该作者 |倒序浏览
有这样一个问题:

程序中,需要一个定时器,定期去检查一些东西。。
用 signal(SIGALAM,my_fun);

...
setitimer(ITIMER_REAL,&a,&b);

假设TIMEOUT是1S,可以正常工作。。


问题在于,程序中有另外一个地方,用到了select();比如说TIMEOUT是2S;

当signal()使用信号量 SIGANLAM的时候,select();不到2S就TIMEOUT了;
(相信是因为,select()也是用signal(SIGALAM,select)来计算时间的)

这样就导致了select()不可以正常工作。
而setitimer()的另外2个信号量并不适合我使用。

查了一下,alarm();其实也是使用了同样的信号量来计时的。
QA:linux MS就只提供这2个定时器(?)

QB:这中情况下,还有什么方法可以做一个计数器,而又不影响我的select()的使用呢?
QC:另外开一条线程,让它sleep()一会然后去调用my_fun() ?      MS这个可行。
QD:有什么更好的解决方法呢?

谢谢。。。
怀念g_timeout_add(); 呵呵。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
2 [报告]
发表于 2011-01-11 19:55 |只看该作者
.....如果我2个地方都是有 setitimer() or select(),相信是会出现同样的问题。
同时将2部分功能放在一个函数中,然后根据条件来判断,又不是我想要的;
定时器A,是一直需要使用的,包含select()是在必要的时候才使用。

g_timeout_add()这种定时器,MS是在主线程中注册一个callback(),然后让主线程去执行。
具体的实现,是否也是使用signal()之类的,不太清楚,希望知道的XD可以说说。
谢谢。

论坛徽章:
0
3 [报告]
发表于 2011-01-11 20:06 |只看该作者
我一般都是独立开一个线程  原公司的游戏框架代码中的TIMEER 也是这么实现的..

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
4 [报告]
发表于 2011-01-11 20:06 |只看该作者
刚才man 了一下sigaction()
MS比较复杂,没用过,要再看看。。

网好像一般都是用信号量,select()或者sleep()来实现的...

我遗漏什么了吗?

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
5 [报告]
发表于 2011-01-11 20:13 |只看该作者
回复 3# wb112200


    恩,这个是一个选择,不过我希望线程越少越好,所以。。。有没有什么办法可以类似select(),alarm() 之类的实现呢?

系统要是提供类似 g_timeout_add()这样的东西就好了。。哈哈,可能是以前用惯了,有点依赖性。。。

谢谢~

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
6 [报告]
发表于 2011-01-11 20:16 |只看该作者
回复 3# wb112200

PS.我喜欢你的头像~~哈哈,前面看了的贴子有你的回帖,就想说了~

论坛徽章:
0
7 [报告]
发表于 2011-01-11 20:18 |只看该作者
回复 5# robin10


    我还真没想过其他的办法呢
    如果对时间的精度要求不高 大可不必考虑那些影响

论坛徽章:
0
8 [报告]
发表于 2011-01-11 20:19 |只看该作者
回复  wb112200

PS.我喜欢你的头像~~哈哈,前面看了的贴子有你的回帖,就想说了~
robin10 发表于 2011-01-11 20:16



    {:3_196:}  我也很喜欢 就贴上了 呵呵

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
9 [报告]
发表于 2011-01-11 20:29 |只看该作者
回复 7# wb112200


    恩,时间精确度倒是要求不严格。
主要是我有点害怕线程。。。
呵呵,以前有个东西,有10来条线程的。。。(当然,如果对PC或者服务器,相当正常吧。。
不过我是用在arm机的。。)

然后有一个BUG,导致某1,2条线程Z掉了。。
kill 还kill不了。。。
精灵进程去重启,也不一定可以成功(估计是某些资源被占用了)。。
搞得头大。。

所以。。我的原则是,能简单尽量简单。。

论坛徽章:
0
10 [报告]
发表于 2011-01-11 20:49 |只看该作者
回复 9# robin10


    {:3_196:}  害怕...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP