代码之家  ›  专栏  ›  技术社区  ›  Adisak

这种快速的原子锁实现可以工作吗?

  •  1
  • Adisak  · 技术社区  · 15 年前

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   doublep    15 年前

    是的,这是一种叫做 spin lock . 但是,请注意,强制转换指针指向 volatile 不保证按标准工作。只需将锁变量声明为 不稳定的 相反。