1

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

4

1 回答 1

1

是的,这是一种称为自旋锁的技术。但是请注意,volatile不能保证强制转换指针按标准工作。只需将您的锁定变量声明为volatile

于 2010-07-13T20:01:35.780 回答