免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: robin10
打印 上一主题 下一主题

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

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


    谢谢wb112200XD~
如果最后没有更好的办法,就使用线程吧。。。。

论坛徽章:
0
12 [报告]
发表于 2011-01-11 21:10 |只看该作者
成熟的网络库一般都集成定时器回调和socket通知,大致上都是底层挂一个rbtree或者堆(里边的节点是按照时间排序的),每次select之前从rbtree/堆里边取出一个将近超时的节点;放到 select就可以了,select返回后要么是超时(从rbtree/堆中取出所有超时节点,回调),要么是socket通知(回调读写函数);这样既可以实现timeout回调和socket通知。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
13 [报告]
发表于 2011-01-12 02:11 |只看该作者
成熟的网络库一般都集成定时器回调和socket通知,大致上都是底层挂一个rbtree或者堆(里边的节点是按照时间 ...
iccc11 发表于 2011-01-11 21:10



先谢谢~  
我有点看不懂,可能比较深奥或者我不太熟悉这方面。
晚上看到网上有人用链表,而BTree之类的做定时器,没有仔细看。不清楚是否和XD说的类似。。?
说说我的环境,arm-linux  kernel 2.6.13,估计除了libc.so libc++.so 和系统调用,我没有太多的其他选择,或者有我没有用过。。。。
最可恶的连glibc 都没有。。。当然,我可以放一个进去,不过为了一个定时器,肯定不值得这样做。

也就是说,我应该没拥有你说的“成熟的网络库”?

另一方面,是因为我使用了signal(),导致了select()的TIMEOUT。
这是否就意味着,我不可以2者同时使用?

论坛徽章:
0
14 [报告]
发表于 2011-01-12 08:47 |只看该作者
最好别用signal,特别是在多线程环境下,这个东西要用好太麻烦了。

开一个线程来做定时器没什么复杂吧,只多一个线程应该是可以接受的,又不需要每个定时器单独开线程的

如果你定时器数量不多,就简单一个数组或者链表就行了,没必要用到复杂的rbtree,等到profile发现这里是性能瓶颈的时候再优化都来得及。

论坛徽章:
0
15 [报告]
发表于 2011-01-12 09:13 |只看该作者
回复 13# robin10


    我说网络库的意思是你自己可以参考一下libevent里边的实现,不是说直接用;自己写一个可能也只需要一天的时间吧。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
16 [报告]
发表于 2011-01-12 10:30 |只看该作者
最好别用signal,特别是在多线程环境下,这个东西要用好太麻烦了。

开一个线程来做定时器没什么复杂吧, ...
drangon 发表于 2011-01-12 08:47



   恩,是的,我已经决定开条线程来做了,不过开一个线程只是做了个定时器,感觉有点没必要了。。。。呵呵。。。。
而且后面可能会涉及到访问的数据是否同步的问题。。

我的初衷是可以有更加方便的解决方法。。。都怪那该死的glibc 太好用了:)
另外一方面是,我之前不知道,signal()和select()之间(可能)会存在这样的冲突。。。所以想大家讨论讨论,有没有更加好的解决方法。。。
非常感谢!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
17 [报告]
发表于 2011-01-12 10:51 |只看该作者
回复  robin10


    我说网络库的意思是你自己可以参考一下libevent里边的实现,不是说直接用;自己写 ...
iccc11 发表于 2011-01-12 09:13



    WOW,这个对我来说,可能有点困难~~我自己没有试过这样的做法~
不排除有空的话,自己会写这样一个东西测试一下。。。。


PS.昨天想到了一个比较BT的方法~~哈哈,当然,现实中估计没人愿意这样做--除非是不得已、时间要求很严格什么的。。。。
不过,仍然是一个解决方案!当是一种可行方案讨论一下,还是值得的。

使用芯片的Timer计时,这样可能有需要累加之类的。。。毕竟芯片的 Timer的频率比较高,我们一般不需要这样小间隔的定时器。。。

哈哈,不知道那位DX有试过,在有OS的情况下,用硬件定时器来给应用程序做定时器呢?
我相信这个做法会很准确。。。。

论坛徽章:
0
18 [报告]
发表于 2011-01-12 10:54 |只看该作者
不是glibc,是glib,这两个东西差别很大的,

glib里面的timer其实也是一样的原理,只不过没有开单独线程,而是在主线程的main loop里面定期检查timeout而已。

你如果不开线程,把自己的主线程做成event loop,定期处理timeout也是可以的

这个东西看看代码其实也没什么特别,要做一个大而全的象glib这样的库可能工作量较大,
但只实现自己需要的功能的话,其实也没多少工作量,没必要羡慕glib,学习吸收一下就行了

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
19 [报告]
发表于 2011-01-12 11:15 |只看该作者
不是glibc,是glib,这两个东西差别很大的,

glib里面的timer其实也是一样的原理,只不过没有开单独线程 ...
drangon 发表于 2011-01-12 10:54



    恩,其实我猜 glib也是按照这个原理做的,虽然我没有读过它们的实现代码。。
因为如果系统只提供setitimer()等几个定时器的接口,
那么估计上面的lib也逃离不了,或者说,它们应该也不会去用一些比较麻烦的方法实现。。。(不过我的确不太清楚glib/glibc的区别,有空了解一下)

不过仍然有一个疑问,假设glib是用信号ITIMER_REAL实现计时的,那么,为什么我同时使用g_timeout_add() and select() (假设前者的TIMEOUT比后者的小),
而没有遇到select()没有到达设定时间就出现了TIMEOUT的情况??

希望可以指点一下。

谢谢~

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
20 [报告]
发表于 2011-01-12 11:26 |只看该作者
http://en.wikipedia.org/wiki/GNU_C_Library

感谢 drangon的指正~
关于 glib and glibc 的一些描述。需要了解的童鞋可以看看~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP