std::atomic_flag实现自旋锁

代码如下:

class spinlock_mutex
{
    std::atomic_flag flag;
public:
    spinlock_mutex():
        flag(ATOMIC_FLAG_INIT)
    {}
    
    void lock()
    {
        while(flag.test_and_set(std::memory_order_acquire);
    }

    void unlock()
    {
        while(flag.clear(std::memory_order_release);
    }
};

代码解释:

这段代码实现了一个简单的自旋锁(spinlock),其中用到了 std::atomic_flag,它是 C++ 提供的最轻量级的原子类型之一,专门用于实现自旋锁等低级同步原语。

成员变量:std::atomic_flag flag

  • atomic_flag 是一个布尔值原子变量:

    • 只能设置为 trueset)或清除为 falseclear

    • 初始值必须通过 ATOMIC_FLAG_INIT 初始化

    • 不支持直接赋值操作(如 flag = true 是非法的)

lock() 方法解释:

  • flag.test_and_set() 是原子操作,行为如下:

    • 返回当前值(true/false)

    • 设置为 true

  • 所以如果当前是 false(表示“未上锁”),第一次调用就会:

    • 返回 false

    • 并将其置为 true

    • 从而跳出 while 循环,成功加锁

  • 如果当前已经是 true(“已经上锁”),就会不断自旋等待。

  • std::memory_order_acquire 是内存序,保证在这之后的所有内存读写不会被 CPU 或编译器提前执行(即加锁后的操作不会重排序到锁前)。

unlock() 方法解释:

  • clear() 将标志位重置为 false,即释放锁

  • std::memory_order_release:保证在释放锁之前的所有写操作对其他线程可见,不会被推迟到锁释放之后。


自旋锁的特点

  • 优点

    • 实现简单,性能极高(用于非常短时间的锁)

    • 适用于多核 CPU 上线程竞争不激烈的情况

  • 缺点

    • 自旋会占用 CPU 资源(线程一直在忙等)

    • 不适合长时间持锁场景

总结用法示例:

spinlock_mutex mtx;

void thread_func()
{
    mtx.lock();
    //临界区   
    mtx.unlock();
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值