gpt4 book ai didi

c++ - InterlockedExchange 与 InterlockedCompareExchange 自旋锁

转载 作者:太空狗 更新时间:2023-10-29 23:51:53 33 4
gpt4 key购买 nike

我已经使用 InterlockedExchange 编写了一个基本的自旋锁(见下文)。然而,我已经看到很多实现都使用 InterlockedCompareExchange。我的方法是否以某种不可预见的方式不正确,如果不是,每种方式的优缺点是什么(如果确实有的话)?

PS 我知道 sleep 很昂贵,我想在调用它之前进行尝试计数。

class SpinLock
{
public:

SpinLock() : m_lock( 0 ) {}
~SpinLock(){}

void Lock()
{
while( InterlockedExchange( &m_lock, 1 ) == 1 )
{
Sleep( 0 );
}
}

void Unlock()
{
InterlockedExchange( &m_lock, 0 );
}

private:
volatile unsigned int m_lock;
};

最佳答案

首先,InterlockedExchange 需要一个LONG。请跟着我重复:LONGint 不同。这可能看起来是一件小事,但它可能会让您感到悲伤。

现在,详细阐述一下 Mats Petersson 所说的话:

你的自旋锁会有可怕的性能,因为 Lock 中的 InterlockedExchange 循环会无条件地修改 m_lock 变量,导致大量工作由处理器在幕后完成,以保持缓存一致性。

更糟糕的是,通过不确保您的 m_lock 变量本身在缓存行上,上述效果被放大并可能影响其他数据,不幸的是与共享缓存行自旋锁的实例。

这些只是此代码的两个比较微妙的问题。还有其他人。一个简单的事实是锁定并不容易正确,您不应该实现自定义锁定原语。请不要重新发明轮子。使用操作系统提供给您的工具。他们自己不太可能成为瓶颈。

如果您确实发现存在性能问题(即,您的分析数据表明存在性能瓶颈),请首先关注算法更改以及改进并行化和减少锁争用。如果问题仍然存在,然后并且只有那时看看别处。

关于c++ - InterlockedExchange 与 InterlockedCompareExchange 自旋锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190749/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com