今天照著Linux源碼片段,嘗試自己實現一個SpinLock提供同不存取共用資源的功能
void GetSpinLock(unsigned long* plock){
GetSpinLock_Loop:
GetSpinLock_Loop:
if(InterlockedCompareExchange(plock,1,0)==0){
return;
}else{
}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