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保證了內存寫入順序。
「volatile DWORD」的影子指針會工作嗎? – Adisak 2010-07-14 00:08:04
另外,這和你鏈接到的「自旋鎖」之間的區別在於,我只用聯鎖操作來獲取鎖。內存屏蔽語義應該足以釋放它。 – Adisak 2010-07-14 00:09:14
我無法通過C++標準的類似法律的噩夢般的語言來解析,但在現實世界的實現中,volatile變量可以完全按照您的需要工作。您在第二條評論中描述的優化實際上也在鏈接文章中提及。請注意,原子類型是C++ 0x標準的一部分,因此您可以使用例如'std :: atomic_flag',如果你的編譯器支持它並且避免手動編碼。 – doublep 2010-07-14 19:39:08