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

Optimization 这种快速原子锁实现可以工作吗?,optimization,locking,atomic-swap,Optimization,Locking,Atomic Swap,我有一个大型数据结构,它使用条带化来减少锁争用。现在我使用的是系统锁,但99.99%的时候,锁是无争用的,而且,持有锁的时间非常少。但是,在保持锁的同时会执行几个不同的内存操作。实际上,与访问数据结构的总时间相比,获取和释放锁所花费的时间是非常重要的 因此,我考虑用以下非常简单的锁替换操作系统锁。这里只显示try和unlock,因为FastTryLock()有99.99%的时间会成功。这里的“pLock”变量表示条带结构中的细粒度锁 我已经编写了下面的实现,它似乎工作得很好,但如果它是正确的或不

我有一个大型数据结构,它使用条带化来减少锁争用。现在我使用的是系统锁,但99.99%的时候,锁是无争用的,而且,持有锁的时间非常少。但是,在保持锁的同时会执行几个不同的内存操作。实际上,与访问数据结构的总时间相比,获取和释放锁所花费的时间是非常重要的

因此,我考虑用以下非常简单的锁替换操作系统锁。这里只显示try和unlock,因为FastTryLock()有99.99%的时间会成功。这里的“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保证内存写入顺序。

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

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

是“volatile DWORD”的阴影指针肯定会工作吗?此外,这与您链接到的“旋转锁”之间的区别是,我只使用联锁op来获取锁。内存击剑语义应该足以释放它。我不能通过C++语言中的类似梦魇语言的法理解析,但在现实世界的实现中,<>代码> Value变量将按照您需要的方式工作。您在第二条评论中描述的优化实际上也在链接文章中提到。请注意,原子类型是C++0x标准的一部分,因此如果您的编译器支持并避免手动编码,您可以使用例如
std::atomic_flag
。实际上,第二个优化似乎并不存在。在解锁操作中,它正在执行和“XCHG”存储,而我正在执行“MOV”。在“重大优化”部分的第二段:“在x86体系结构的后续实现中,spin_unlock可以安全地使用解锁的MOV而不是锁定的XCHG,这要快得多。”是否会使用“易失性DWORD”的阴影指针确定工作?此外,这和您链接到的“旋转锁”之间的区别是,我只使用联锁op来获取锁。内存击剑语义应该足以释放它。我不能通过C++语言中的类似梦魇语言的法理解析,但在现实世界的实现中,<>代码> Value变量将按照您需要的方式工作。您在第二条评论中描述的优化实际上也在链接文章中提到。请注意,原子类型是C++0x标准的一部分,因此如果您的编译器支持并避免手动编码,您可以使用例如
std::atomic_flag
。实际上,第二个优化似乎并不存在。它在解锁操作中为存储区执行和“XCHG”,而我只是在执行“MOV”。在“重大优化”部分的第二段:“在x86体系结构的后续实现中,spin_unlock可以安全地使用解锁的MOV而不是锁定的XCHG,这要快得多。”