Saturday, June 12, 2010

Windows API Mutex 與 Yourself SpinLock

Windows API因為安全、相容、穩定性等等,往往必須經過許多檢查、判斷、呼叫,需要使用不少的時間才能達到真正的目的

今天照著Linux源碼片段,嘗試自己實現一個SpinLock提供同不存取共用資源的功能

void GetSpinLock(unsigned long* plock){
    GetSpinLock_Loop:
if(InterlockedCompareExchange(plock,1,0)==0){
return;
    }else{
__asm{
            rep nop
jmp GetSpinLock_Loop
        }
    }


    return;
}
void ReleaseSpinLock(unsigned long* plock){
  *plock=0;

  return;
}

並且做了個測試,比較具有同樣功能的Windows Mutex
測試中,兩個Process都嘗試存取同一塊記憶體,並且將當中的數值+1
在測試結果中發現到,使用Windows Mutex所需的時間幾乎是自己實現的簡單SpinLock的12倍

所以下次如果有使用一些簡單功能的API,不妨試試看自己實現它,可能會發現意想不到的驚喜!

No comments:

Post a Comment