随笔


1.ProcWatch实例代码为什么会占用100%的CPU?(3rd->demo->ProcWatchClientConsole)

这里特别说一下,当时多核虚拟机时也不会到100%,一半cpu使用率会很低,到了20~30就已经很高了,因为是多核啊

bug:

#define EVENT_NAME    L"ProcEventx"  //  (L"//global//procEvent")  //win7中需要加入global否则会出错误的
#define DRIVER_NAME  "ProcWatch"

 while (::WaitForSingleObject(hProcessEvent, INFINITE))//是阻塞的,会让出cpu,当hprocessevent为null时,返回的是-1,这样会一直轮询拿数据,底层通过event与r3进行同步
    {
Sleep(1000);
        DWORD    dwRet = 0;
        BOOL     bRet = FALSE;
.

.

.  
    }

这个bug的原因在于逻辑错误,首先这个while循环的目的是像通过内核对象“事件”,来实现r0与r3的同步,但是wait函数时阻塞函数,当event没有被赋值,即内核没有释放event来通知r3已经ok,可以来拿数据了,wait函数会阻塞并交出cpu的使用。

所以当是#define EVENT_NAME    L"ProcEvent 时,事件没有准备好时,wait函数返回的是0,所以不会进入while循环,这个不会占用cpu,当是#define EVENT_NAME    L"ProcEventx“时,由于并不跟r0内核event对应,所以hProcessEvent是NULL,这样wait函数返回-1,会一直占用cpu,这就是原因。


正确的写法是:

    //while (TRUE)
    //{
        //DWORD    dwRet = 0;
        //BOOL     bRet = FALSE;


        //::WaitForSingleObject(hProcessEvent, INFINITE);


就可以了

2.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值