zoukankan      html  css  js  c++  java
  • 同步 互斥体和信号量

    1、互斥体和信号量都是为了实现同步,但是二者解决的问题不一样,也就是说应用场景不一样。

    2、互斥体通过加锁,对于共享的资源,大家排队,依次去访问,一个一个来。也就是说,任何时刻只有一个线程访问,其他的线程等待。

    3、互斥体加锁存在的问题:无法控制线程的访问顺序。考虑两个线程A,B,访问顺序可能是A-B,也可能是B-A,就要看谁先加锁。

    4、考虑下面的场景,生产者/消费者模式,假定A是生产者,B是消费者,生产一个,消费一个,循环下去,这样就要求访问顺序必须是A-B-A-B...

    5、怎么解决这个问题?

      使用信号量,初始化,信号量的容量是1,可用资源为0。A进行V操作,资源加1,B进行P操作,资源减1。A进行V操作的时候,如果可用资源为1(容量满了),必须等待,直到B消费掉资源。B进行P操作的时候,如果可用资源为0(没有资源可用),必须等待,直到A生产出一个资源。通过这种方式控制线程访问顺序。

    6、这里可以看出二者的区别:

      a、互斥体:大家排队,一个一个来。信号量:控制访问顺序,当前线程检查条件,条件不满足,等待其他的线程去操作,使条件满足。

      b、对互斥体加锁,必须是谁加锁谁释放。而对信号量PV操作,是不同线程之间可以进行成对的PV操作。

      c、可以使用信号量的PV操作来模拟互斥体的加锁,信号量容量为1,可用资源为1,每个线程都先P操作,do sth ,再V操作,执行顺序取决于谁先进行了P操作。比如:B先P操作,A的P操作阻塞,必须等待,直到B do sth,然后V操作之后,A的P操作才能继续下去。

    7、特别注意:PV操作,只有P操作才会导致线程阻塞,V操作不会导致线程阻塞。

  • 相关阅读:
    Javascript笔记09:Javascript的下拉式导航菜单
    Javascript笔记08:Javascript的if...else语句
    Android(java)学习笔记84:SQLiteDatabase的query方法参数
    Android(java)学习笔记83:各种边距设置
    Android(java)学习笔记82:利用SpannableString设置复合文本
    PHP笔记06:http响应中的状态码
    html笔记04:在html之中导入css两种常见方法
    POJ 3307 Smart Sister
    ZOJ 2872 Binary Partitions
    HDU 4685 Prince and Princess
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4510298.html
Copyright © 2011-2022 走看看