LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2905|回复: 19

如何让一个线程休眠?单位是us

[复制链接]
发表于 2006-4-10 18:25:28 | 显示全部楼层 |阅读模式
想让多线程中的单个线程休眠100us但不互相影响,用select好像很不精确。能有什么好办法吗?
发表于 2006-4-10 23:25:56 | 显示全部楼层
select为什么不精确?
回复 支持 反对

使用道具 举报

发表于 2006-4-11 09:07:16 | 显示全部楼层
系统时钟能精确吗到0.1ms吗?
回复 支持 反对

使用道具 举报

发表于 2006-4-11 16:27:35 | 显示全部楼层
当然了。pentium的TSC。计数频率就是主频频率,哪怕是1G的主频,你算算看好了!
回复 支持 反对

使用道具 举报

发表于 2006-4-11 17:36:34 | 显示全部楼层
Post by haohao_h
select为什么不精确?

select的超时时限到达的时候,系统可能正在执行一个快速系统调用(fast system call),这时CPU的使用权不会被转移,也就是说这个快速系统调用必须执行完毕后才会释放CPU,那么再经过一些调度后才可能轮到来处理select,这中间的时间差距就造成了select的不准确.
回复 支持 反对

使用道具 举报

发表于 2006-4-11 17:43:09 | 显示全部楼层
Post by chairman
想让多线程中的单个线程休眠100us但不互相影响,用select好像很不精确。能有什么好办法吗?

我曾经也问过这个问题,有网友回答说用sleep来实现,理由是线程在Linux下实质上也是进程,而sleep是用来睡眠一个进程的,这样的解释似乎合理.但是我试了的结果是"不可以",它会将整个进程阻塞掉.你也可以来试试,看能否达到这样的目的
回复 支持 反对

使用道具 举报

发表于 2006-4-11 18:06:44 | 显示全部楼层
但是操作系统调度进程可不是用CPU里的计数器来实现的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-11 21:04:26 | 显示全部楼层
Post by Arthur.Echo
我曾经也问过这个问题,有网友回答说用sleep来实现,理由是线程在Linux下实质上也是进程,而sleep是用来睡眠一个进程的,这样的解释似乎合理.但是我试了的结果是"不可以",它会将整个进程阻塞掉.你也可以来试试,看能否达到这样的目的

用sleep确实是可以的。因为现在的LINUX用的NPTL之后是1:1的调度。但是如果把sleep换成usleep,或者select休眠us级别的话,明显发现就不对。usleep和select的返回都太慢了。应该是10ms级别的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-11 21:06:06 | 显示全部楼层
Post by Arthur.Echo
我曾经也问过这个问题,有网友回答说用sleep来实现,理由是线程在Linux下实质上也是进程,而sleep是用来睡眠一个进程的,这样的解释似乎合理.但是我试了的结果是"不可以",它会将整个进程阻塞掉.你也可以来试试,看能否达到这样的目的

用sleep确实是可以的。因为现在的LINUX用的NPTL之后是1:1的调度。但是如果把sleep换成usleep,或者select休眠us级别的话,明显发现就不对。usleep和select的返回都太慢了。应该是10ms级别的。我说的这种是情况是在多线程的情况下,让两个线程一个select 10us然后打印一条语句,一个select 20us然后打印。发现打印的很慢,更本不是us级别的
回复 支持 反对

使用道具 举报

发表于 2006-4-11 22:13:57 | 显示全部楼层
Post by Arthur.Echo
select的超时时限到达的时候,系统可能正在执行一个快速系统调用(fast system call),这时CPU的使用权不会被转移,也就是说这个快速系统调用必须执行完毕后才会释放CPU,那么再经过一些调度后才可能轮到来处理select,这中间的时间差距就造成了select的不准确.

这个你就不要想了,linux并不是实时系统,我想就是vxworks也做不到在1us内就响应吧!
但我觉得你所说的理由应该不成立,us级的延时进程是不会被调度的,虽然我没看过usleep是怎么实现的!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表