我有一个大数据结构,它使用条带化来减少锁争用。现在我使用的是系统锁,但是99.99%的时间,锁是未经测试的,而且,持有锁的时间非常短。但是,在保持锁的同时执行几个不同的内存操作。与访问数据结构的总时间相比,它实际上已经达到了获取和释放锁所花费的时间非常重要的程度。
所以我考虑用以下非常简单的锁替换操作系统锁。这里只显示Try和Unlock,因为99.99%的时间fastTrylock()将成功。这里的“plock”变量表示striped结构中的细粒度锁。
我已经写了下面的实现,它看起来工作得很好,但是如果它是正确的或不正确的,我会感谢您的确认。
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()是一个no op,因为CPU保证内存写入顺序。