close
最近在 Debug 一個程式
在 XP 上跑起來運作速度正常
但是在 Win7上跑卻不是這麼回事
跑起來非常的慢(lag)而且隨便操作一下動不動就沒有回應
在追蹤了許久之後才發現 Critical Section 這個地方寫錯了
Param 是我們要保護的變數而它會在兩個地方被使用
其中一個地方就是以下的程式
但是 CAutoLock 放的位置並不一樣
修改前的 CAutoLock 把整個 while loop 當作 Critical Section Lock 起來
但是這樣卻把 Sleep(10) 也包了進去!!
也就是它在 Critical Section 中 Sleep
雖然讓別的 Thread 可以執行但卻等不到 Param
除非等它跳出 while 但是這樣要等多久...這樣跑起來當然慢
所以 CAutoLock 要小心地使用!

修改前:
Critical Section
while(have_something){
                CAutoLock cAutoLock(&Msg);
if(WaitForSingleObject(m) == WAIT_OBJECT ) 
break;
if(CheckReq(&com)) 
continue;
                pbp = PlayProc(&Param);
if(pbp != PBP_DATA){
Sleep(10);
continue;
}
}

修改後:
Critical Section
while(have_something){
if(WaitForSingleObject(m) == WAIT_OBJECT ) 
break;
if(CheckReq(&com)) 
continue;
{
CAutoLock cAutoLock(&Msg);
pbp = PlayProc(&Param);
}
if(pbp != PBP_DATA){
Sleep(10);
continue;
}
}



而 XP 為啥會沒事呢?
也許是因為
XP Win7 task time slice 不一樣
而且 Sleep 多少 millisecond 對 XP 來說只是參考並沒有很準
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 JohnDX 的頭像
    JohnDX

    我要回家想一想~

    JohnDX 發表在 痞客邦 留言(0) 人氣()