首先我们需要明确,自旋锁式一种用于保护多线程共享资源的锁,它在Linux 内核中也有所使用.(epoll 中有使用) 和一般互斥锁不同的式当自旋锁尝试获取CPU的时候可以是一种忙等的状态,自旋锁不能主动放弃CPU ,如果是内核中的自旋锁,如果没有及时释放一种拿到手中,可能会导致系统挂起
我们在这里使用cas 操作来实现自旋锁,如果内存中的值没有达到预期值就一直进行循环等待,当预期值相等的时候,进行交换
bool compare_exchange_weak (T& expected, T val,
memory_order sync = memory_order_seq_cst) volatile noexcept;
bool compare_exchange_weak (T& expected, T val,
memory_order sync = memory_order_seq_cst) noexcept;
bool compare_exchange_weak (T& expected, T val,
memory_order success, memory_order failure) volatile noexcept;
bool compare_exchange_weak (T& expected, T val,
memory_order success, memory_order failure) noexcept;
//compare_exchange_weak 与compare_exchange_strong 主要的区别在于内存的值与expected
//相等的时候 ,cas操作是不是一定成功,compare_exchange_weak 有概率会失败
class Spinlock
{
public:
Spinlock() : flag_(false) {}
~Spinlock() = default;
void lock()
{
bool excepect = false;
while(!flag_.compare_exchange_strong(excepect,true))
{
excepect = false;
}
}
void unlock()
{
flag_.store(false);
}
private:
std::atomic<bool> flag_;
};