原理
自旋锁是一种基于忙等待的锁,它在等待锁的过程中不会阻塞线程,而是通过循环不断地检查锁的状态,直到获取到锁为止。自旋锁适用于锁的持有时间很短的情况,因为在等待锁的过程中,线程会一直占用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);}
};