首页
社区
课程
招聘
[求助]Windows下可以达到1ms的休眠,或1ms级别的线程切换吗?
发表于: 2008-7-11 16:57 8193

[求助]Windows下可以达到1ms的休眠,或1ms级别的线程切换吗?

2008-7-11 16:57
8193
如题,这是在一些要求高性能的系统中经常遇到的问题。

例如,服务器A同时向N台子服务器发送查询请求,当所有的结果返回时,主线程再对这些结果进行一些处理。为了避免主线程的堵塞,我们一般会开启新线程来执行这些查询任务,但是这样无论如何都会产生一些延迟。我尝试过消息机制,线程同步机制,还有再开一个新线程不断查询返回结果的方法,都会产生50ms~300ms不等的延时,请问大家有什么办法可以尽量降低这样的延时?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 259
活跃值: (26)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
貌似windows的轮询就是50以上,也就是说sleep(50)以上才算有效果,以下就=50了

记得是50,请大家指正
2008-7-11 21:47
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
ZwYieldExecution
或者是
ZwDelayExecution

很久不涉及这个已经有些遗忘了,还有那个KeDelayExecutionThread啥来着
···
2008-7-11 21:49
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
可以直接在驱动里做延时,然后callbacktousermode一下~~
2008-7-11 21:50
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
#include <mmsystem.h>
#pragma comment (lib,"winmm.lib")

使用前:
timeBeginPeriod ( 1 ) ;  // 设置为精度1ms

创建个内核事件对象
HANDLE hEvent = CreateEvent ( …… ) ; // 只用于WaitForSingleObject ,不用设置信号
这个事件只用于:
WaitForSingleObject ( hEvent, 1 ) ;

这样就可实现精确定时。

除了定时。当线程比较繁忙时,用这么一招,往往可以降低CPU占用率
2008-7-12 00:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在我这里的双核机器上,主线程发出一个信号立刻sleep,另一个线程接到信号立刻输出耗时,一般耗时20ms左右,不知道双核和单核的机器上是否相同
2008-7-12 10:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个最简单,我试一下,驱动不会写,调用zw开头的函数也不会,正在学,呵呵
2008-7-12 10:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
经过测试,北极星的方法可行,不过有些问题出现.

        timeBeginPeriod(1);
        m_hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);

        InitBenchmark();//初始化计时器
        BM_START(1);//开始计时

        for(int i=0;i<100;i++)
        {
                ::WaitForSingleObject(m_hEvent,1);
        }

        BM_END(1);//停止计时
        timeEndPeriod(1);

        ConsoleWrite();//输出计时结果

循环100次的时候,耗时要么是150ms左右,要么是200ms左右.
但是如果只进行一次的时候,有1900us(1.9ms)的,有15000us(15ms)的,也有6200us(6.2ms)的,还有-44000us(-4.4ms)的.很奇怪的是,基本只有这几种结果,其中15ms出现得最多.这是什么原因呢?
2008-7-12 11:17
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
9
你用的是高精度计时?
2008-7-12 14:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
恩,是用QueryPerformanceCounter来计算的,是它测量有问题吗?
2008-7-12 16:06
0
游客
登录 | 注册 方可回帖
返回
//