原子操作/CAS/锁

本文探讨了原子操作在多线程编程中的应用,包括单条指令原子操作、临界区与锁机制。重点介绍了比较特殊的CAS(Compare and Swap)操作,它允许在不使用锁的情况下实现线程安全。无锁编程与有锁编程的主要区别在于,有锁编程中线程被中断会影响其他线程,而无锁编程则不会。通过CAS,可以实现无锁队列的EnQueue操作,提高并发性能。此外,CAS也可用于构建锁机制。

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

(1)原子操作:单条指令

(2)多条指令原子操作(临界区):锁(内存屏障+原子变量)

(3)CAS也是一种原子操作(不同ARCH都有对应的指令实现)——CAS要知道变量的当前值的前提下才能重新设置变量的值

(4)CAS的引入可以实现无锁编程

(5)有锁编程和无锁编程的区别

a. 有锁编程:如果当前获取锁的线程被中断,其他等待锁的线程也就停下来,直到被中断的线程中断返回,继续执行释放锁后,其他线程才能继续获取锁运行;

b. 无锁编程当前线程被中断不影响其他线程运行;

c. 无锁编程示例:

EnQueue(Q, data) //进队列
{
    //准备新加入的结点数据
    n = new node();
    n->value = data;
    n->next = NULL;
    do {
        p = Q->tail; //取链表尾指针的快照
    } while( CAS(p->next, NULL, n) != TRUE); 
    //while条件注释:如果没有把结点链在尾指针上,再试
    CAS(Q->tail, p, n); //置尾结点 tail = n;
}

题外话(6)不仅仅是原子变量,CAS也可以用来实现锁:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

denglin12315

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值