第8章 线程的同步

8.1 线程为什么要同步

线程是进程的”分身术“,是进程代码的执行序列,提高了进程的并发和程序执行效率;既然线程发明就是要并发执行的,所以线程肯定会相互共享资源;资源一旦共享就会引发其他的问题,比如资源、变量先后被修改造成同一个线程获取的结果是错误的;此时就需要 线程同步来解决数据冲突的问题

8.2  线程同步的解决方案  --锁

  • 因为公共资源会被多个线程修改,所以每次修改(读、写)资源先获取锁,然后在修改;完成修改后解锁
  • 锁: lock 在高级语言中非常简单:lock()/unlock()
  • 锁带来的问题:循环等待--> 线程A 获取一个资源的锁,但因为线程A 持续等待I/O 资源,所以一直没有释放锁,导致后面的线程B 一直在等待;

8.3 解决线程循环等待的问题 --- 线程的睡眠、叫醒 (sleep/wakeup)

  • 上面锁带来的新问题: 循环等待确实让其他线程等待的时间太长会导致资源浪费,所以发明了 sleep wakeup 的功能;
  •  当线程A 获取一个资源的锁,线程B 就不用一直等待线程A 释放这个锁,而是自己去sleep;当这个lock 被释放时去叫醒线程B 
  •  某个资源的lock 可以有一个排队的queue,当轮流到那个线程就wakeup 哪个线程即可
  •  这个方案也会导致死锁: 如果线程B 等待资源被被的线程lock,这时就会sleep,但此时cpu切换了;那这个线程就是属于已经让出cpu,想要sleep,但是sleep 的命令没有执行;此时如果另外一个线程释放了lock,发信号wakeup 上面的线程;发现那个线程本身就没有sleep,所以这个wakeup 就失效了;导致其获取cpu 控制权后还是执行sleep 的命令,导致这个线程本来不用等待直接执行的但是又进入了sleep;而且这时没有信号再通知线程wakeup,导致这个线程其实就直接“僵死了"

8.4  解决上面线程"僵死"的问题--- 信号量

  • 信号量就是把信号(wakup)放在一个地方维护起来,让信号量不丢失,这样就可以在线程获取cpu时执行这个信号,然后让互斥的两个进程进行
  • 信号量也可以理解为一个计数器:up down 2个计数器,计数器的数值就是当前累计的信号数量
  • 信号量同样带来了问题: 如果信号量里面的信号执行顺序不一致会导致死锁,所以信号量的执行顺序就会对编译器依赖比较大,所以这时对程序员写程序就要求比较高了,需要开发同学懂编译器的原理和注意事项,肯定会出现问题

8.5 解决上面信号量依赖编辑器导致写程序效率下降的问题  ---- 管程(监视器; monitor)

  • 因为如果让每一个程序员都了解汇编是不现实的,那就把信号同步相关的工作都交给一个专门的机构来完成,这个机构就是管程
  • 管程: 是一组子程序、变量、数据结构的集合,就是把需要进行同步的代码用一段管程来管理起来
# monitor 管程的代码
begin monitor

#** 里面是需要进行同步的代码**#
#** 管程里面的代码,管程会负责进行管理**#
#** 程序员就可以完全不用维护信号量的相关工作**#

end monitor 


  • 管程里面的2个机制: wait sigal 2个动作,每个动作都是原子的
<管程的动作>
1). 释放lock
2). 把线程挂在条件为x的的队列上
3). sleep ,等待被wakeup

</管程的动作>


8.6 消息传递

  • 上面的管程机制、锁机制都是在单台机器上有效,所以如果在多台机器的分布式程序,就需要进行消息传递;消息传递有2个重要的方便:消息丢失、消息识别
  •  消息丢失用TCP 协议来保障,消息识别给打一个标识即可

8.7 栅栏

  • 在计算机里面很多的大task 要分解成多个小的task 来执行(一条高级语言会分解成多个微指令,或者指令集来执行)但执行的阶段结果需要等待依赖的数据产出才可以进行下一步,所以需要这样的一种等待所有依赖的数据ready 再进行下一步动作
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值