美文网首页
锁:并发操作中,解决数据同步的四种方法

锁:并发操作中,解决数据同步的四种方法

作者: 一生逍遥一生 | 来源:发表于2021-11-25 23:34 被阅读0次

原子操作

在C函数中按照特定的方式嵌入汇编代码,实现原子操作就更方便,在代码中加上lock前缀的addl、subl、incl、decl指令都是原子操作,lock前缀表示锁定总线。
所以操作系统在实现单变量的原子操作的时候,是需要添加lock前缀的,原子操作只适用于单体变量。

中断控制

在关闭终端函数中先保存eflags寄存器,然后执行cli指令,在开启中断函数中直接回复之前保存的eflags寄存器就行。
pushfl指令把eflags寄存器压入当前栈顶,popfl将当前栈顶的数据弹入到eflags寄存器中,是否开启终端取决于上一次eflags寄存器中的值, 并且popfl指令只会影响eflags寄存器中的IF位。
这是在单核的情况下。

自旋锁

自旋锁的原理:首先读取锁变量, 判断其值是否已经加锁,如果未加锁则执行加锁,然后返回,表示加锁成功;如果已经加锁,就返回开始继续执行第一步进行后续操作。
自旋锁必须保证读取所变量和判断并加锁的操作是原子执行的。x86 CPU提供了一个原子交换指令,xchg, 它可以让寄存器里的一个值跟内存空间中的一个值做交换。
自旋锁依然有中断嵌套的问题,也就是在使用自旋锁的时候需要注意中断。

信号量

使用信号量的步骤:

  • 1获取信号量
    • 首先对用于保护信号量自身的自旋锁sem_lock进行加锁
    • 对信号量值sem_count执行减1操作,并检查其值是否小于0
    • 如果sem_count小于0,就让进程进入等待状态并且将其挂入sem_waitlist中,然后调度其他进程运行。
  • 2.代码执行流开始执行相关操作
  • 3.释放信号量
    • 首先对用于保护信号量自身的自旋锁sem_lock进行加锁
    • 对信号量值sem_count执行加1操作,并检查其值是否大于0
    • 如果sem_count大于0,执行唤醒sem_waitlist中进程的操作,并且需要调度进程时就执行进程调度操作,不管sem_count的值是什么,都标记信号量释放成功,也要对sem_count进行解锁。

相关文章

  • 锁:并发操作中,解决数据同步的四种方法

    原子操作 在C函数中按照特定的方式嵌入汇编代码,实现原子操作就更方便,在代码中加上lock前缀的addl、subl...

  • 线程核心之同步,死锁,交互

    同步 多个线程同时修改一个数据时(也叫并发操作),容易导致同步问题(同时修改),产生脏数据 解决方法 在多个线程同...

  • ZooKeeper实现读写锁

    1 读写锁的概念 读写锁是计算机程序的并发控制的一种同步机制,用于解决读写问题,读操作可并发重入,写操作是互斥的。...

  • JAVA中各种锁介绍

    乐观锁,悲观锁 从并发同步的角度。悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修...

  • mysql(innodb)事务和锁

    事务的四种隔离级别 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。我们的数据库锁,也是为了...

  • 求你了,别再说数据库锁的只是索引了

    在MySQL数据库中,为了解决并发问题,引入了很多的锁机制,很多时候,数据库的锁是在有数据库操作的过程中自动添加的...

  • MySQL数据库锁机制

    01概述 数据库事务ACID中的隔离性是通过锁和MVCC实现的,锁用于并发写操作,MVCC用于并发读操作。因此,数...

  • 第5章 Java的锁

    基本概念: 锁:控制多线程并发访问资源;队列同步器:管理同步状态,实现锁;同步状态:同步器的操作对象,int类型;...

  • Java16-7 练习

    解决多线程中输出错误的问题 分析:1、找到共享数据2、线程任务中是否有多条操作共享数据的代码解决方法: 同步 但是...

  • 2019-08-16-锁的分类

    锁的分类: 一,线程是否需要锁住同步资源 广义角度上的概念,对于同一个数据的并发操作下 乐观锁认为自己使用数据的时...

网友评论

      本文标题:锁:并发操作中,解决数据同步的四种方法

      本文链接:https://www.haomeiwen.com/subject/ckttxrtx.html