并发编程:互斥锁、信号量、条件变量

本文深入探讨了并发编程中的原子操作,包括TAS、CAS和FAA,并详细介绍了互斥锁的实现原理,特别提到了二值信号量作为互斥锁的特殊情况。此外,还阐述了条件变量的实现机制,结合信号量和无锁队列的应用实例,为理解和应用这些同步原语提供了全面的指导。
摘要由CSDN通过智能技术生成


在这里插入图片描述

原子操作

  • TAS:Test and Set,写值到某个内存位置并传回其旧值。汇编指令BST
    在这里插入图片描述

  • CAS: Compare and Swap,操作过程:将内存位置V的值与A比较(compare),如果相等,则说明没有其它线程来修改过这个值,所以把内存V的的值更新成B(swap),如果不相等,说明V上的值被修改过了,不更新,而是返回当前V的值,再重新执行一次任务再继续这个过程。会存在ABA问题。

    bool compare_and_swap ( int *memory_location, int expected_value, int new_value)
    {
        if (*memory_location == expected_value)
        {
            *memory_location = new_value;
            return true;
        }
        return false;
    }
    
  • FAA: Fetch And Add,一般用来对变量做 +1 的原子操作

互斥锁的实现

在这里插入图片描述

信号量的实现

当信号量为一个二值信号量时,则退化为互斥锁的作用。

  1. 初始化,给与它一个非负数的整数值。
  2. 运行P(wait()),信号量S的值将被减少。企图进入临界区段的进程,需要先运行P(wait())。当信号量S减为负值时,进程会被挡住,不能继续;当信号量S不为负值时,进程可以获准进入临界区段。
  3. 运行V(signal()),信号量S的值会被增加。结束离开临界区段的进程,将会运行V(signal())。当信号量S不为负值时,先前被挡住的其他进程,将可获准进入临界区段。
    在这里插入图片描述
    其中对于信号量sem的操作过程应该是原子操作。

条件变量的实现

在这里插入图片描述
参考文章:
信号量及其使用和实现(超详细)
并发无锁队列
C++11 - 无锁队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值