第十三课:C++多线程的自旋锁

本文展示了C++中使用atomic_flag实现自旋锁的代码例子。通过test_and_set与clear函数控制锁的状态,线程在获取锁时会进行循环检测,而不会进入睡眠状态。示例中创建了两个线程,一个设置锁并启动,另一个在短暂延迟后释放锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码案例有注解。

#include<thread>
#include<iostream>

using namespace std;
using namespace this_thread;

/*

atomic_flag :无锁的原子类型
1,test_and_set() //如果没有被设置,就设置一下,如果设置了返回true
2,clear() :清除标记 让下一次调用test_and_set()返回false
其他原子类型:用is_lock_free()判断是否无锁

自旋锁: 不用等待,不会引起调用者的休眠,调用者一直循环,等待锁的释放
互斥锁:资源申请者只能进入睡眠状态

*/

atomic_flag flag = ATOMIC_FLAG_INIT;  // ATOMIC_FLAG_INIT 大挂号

atomic_flag locks = ATOMIC_FLAG_INIT;

void func1(int n)
{
    while (locks.test_and_set(memory_order_acquire))
    {
        printf("等待中......%d\n", n);
    }
    printf("线程启动");
}

void func2(int n)
{
    printf("线程开始启动:%d\n",n);
    this_thread::sleep_for(1ms);
    locks.clear();
    printf("当前线程结束:%d\n",n);
}

int main()
{

    locks.test_and_set();

    thread t1(func1,1);
    thread t2(func2,2);

    t1.join();
    t2.join();
    
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值