5,530
社区成员
发帖
与我相关
我的任务
分享
class SpinLock
{
public:
SpinLock()
: v_(0)
{}
void Lock()
{
while (::InterlockedCompareExchange(&v_, 1, 0) == 1)
{
_mm_pause(); // 这里可以优化以适应比较激烈的场合
}
}
void UnLock()
{
::InterlockedCompareExchange(&v_, 0, 1);
}
private:
enum {CACHE_SIZE = 64}; // 高速缓存的优化
char padding1[CACHE_SIZE/2];
long v_;
char padding2[CACHE_SIZE/2 - sizeof(long)];
};
void yield(unsigned k)
{
if (k < 4)
{
}
else if (k < 16)
{
_mm_pause();
}
else if (k < 32)
{
::Sleep(0);
}
else
{
::Sleep(1);
}
}
class spinlock
{
public:
spinlock()
: v_(0)
{
}
bool try_lock()
{
long r = InterlockedExchange(&v_, 1);
_ReadWriteBarrier(); // 这个起嘛作用?
return r == 0;
}
void lock()
{
for (unsigned k = 0; !try_lock(); ++k)
{
yield(k);
}
}
void unlock()
{
// 这里没有使用Interlocked系列函数,why?
_ReadWriteBarrier();
*const_cast<long volatile*>(&v_) = 0; // const_cast和volatile?
}
private:
long v_;
};