我使用 InterlockedExchange 编写了一个基本的自旋锁(见下文)。但是,我已经看到很多实现都使用 InterlockedCompareExchange 代替。我的是否以某种不可预见的方式不正确,如果不是,每种方式的优缺点是什么(如果确实有的话)?
PS我知道睡眠很昂贵,我想在打电话之前进行尝试计数。
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;
};