原理
自旋锁是一种基于忙等待的锁,它在等待锁的过程中不会阻塞线程,而是通过循环不断地检查锁的状态,直到获取到锁为止。自旋锁适用于锁的持有时间很短的情况,因为在等待锁的过程中,线程会一直占用CPU资源,如果锁的持有时间很长,那么自旋锁会浪费大量的CPU资源。
#include <atomic>
#include "../base/debug_view.h"
class Spinlock {
private:
std::atomic_flag *at_flag;
public:
Spinlock()
{
zz_log("constructor init");
//由于std::atomic_flag类的拷贝构造函数被删除。
//std::atomic_flag是一个特殊的原子类型,它被设计为不可拷贝的,因此拷贝构造函数被删除了。
// 所以这里定义为共享对象,多个线程进行引用,而不是进行拷贝、
std::atomic_flag lock_flag = ATOMIC_FLAG_INIT;
at_flag = &lock_flag;
}
void lock()
{
zz_log("我来抢劫锁啦!!!");
while (at_flag->test_and_set(std::memory_order_acquire))
{
zz_log("未获取到,虎视眈眈,轮询等待...");
}
zz_log("OK, 拿到了!!!");
}
void unlock()
{
zz_log("吃饱啦,不需要啦,可以放下锁啦!!!");
at_flag->clear(std::memory_order_release);
}
};