您的位置:首页 > 其它

随笔

2015-11-02 15:31 239 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: