2010-07-13 19 views
1

我有一個大型數據結構正在使用條帶來減少鎖爭用。現在我正在使用系統鎖,但99.99%的時間,鎖是無可爭議的,而且,鎖的時間量相當小。但是,在鎖定期間執行幾個不同的存儲器操作。實際上,與訪問數據結構的總體時間相比,獲得鎖定和釋放鎖定的時間顯着。這個快速原子鎖實現工作嗎?

因此,我想用以下非常簡單的鎖取代OS鎖。這裏僅顯示嘗試和解鎖,因爲99.99%的時間FastTryLock()將會成功。這裏的「pLock」變量表示條紋結構中的細粒度鎖。

我已經寫了下面的實現,似乎工作正常,但我會感謝確認,如果它是正確的或不正確的。

bool FastTryLock(DWORD *pLock) 
{ 
    if(0==AtomicXCHG(pLock,1)) { 
     MemoryBarrier_LightWeight(); return(true); 
    } 
    return(false); 
} 
void FastUnlock(DWORD *pLock) 
{ 
    MemoryBarrier_LightWeight(); *((volatile DWORD*)pLock)=0; 
} 

在PC上,MemoryBarrier_LightWeight()是無操作的,因爲CPU保證了內存寫入順序。

回答

1

是的,這是一種叫做spin lock的技術。但是請注意,指向volatile的投影指針不能保證按照標準工作。只需聲明您的鎖定變量爲volatile

+0

「volatile DWORD」的影子指針會工作嗎? – Adisak 2010-07-14 00:08:04

+0

另外,這和你鏈接到的「自旋鎖」之間的區別在於,我只用聯鎖操作來獲取鎖。內存屏蔽語義應該足以釋放它。 – Adisak 2010-07-14 00:09:14

+0

我無法通過C++標準的類似法律的噩夢般的語言來解析,但在現實世界的實現中,volatile變量可以完全按照您的需要工作。您在第二條評論中描述的優化實際上也在鏈接文章中提及。請注意,原子類型是C++ 0x標準的一部分,因此您可以使用例如'std :: atomic_flag',如果你的編譯器支持它並且避免手動編碼。 – doublep 2010-07-14 19:39:08