我有一个使用条带化来减少锁争用的大型数据结构。现在我正在使用系统锁,但 99.99% 的时间,锁是无争议的,而且持有锁的时间非常少。但是,在持有锁时会执行几个不同的内存操作。实际上,与访问数据结构的总时间相比,获取和释放锁所花费的时间非常重要。
所以我考虑用以下非常简单的锁替换操作系统锁。这里只显示尝试和解锁,因为 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 保证内存写入顺序。