我有一个大型数据结构,它使用条带化来减少锁争用。现在我使用系统锁,但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保证了内存写入顺序。