【操作系统】自旋锁实现&&自旋锁原理(亲测可用)

原理

自旋锁是一种基于忙等待的锁,它在等待锁的过程中不会阻塞线程,而是通过循环不断地检查锁的状态,直到获取到锁为止。自旋锁适用于锁的持有时间很短的情况,因为在等待锁的过程中,线程会一直占用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);
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值