• 同步 互斥体和信号量


    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操作不会导致线程阻塞。

  • 相关阅读:
    [换根dp] Codeforces Round 67 (Rated for Div. 2) E
    [思维]Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) A B1 B2 C D
    [Comet OJ
    关于Winform中的消息框MessageBox
    C#截取字符串的几种方式
    C#中的时间格式大全
    winform中dev的TreeList基本使用方式
    拉取项目时error setting certificate verify locations解决方式
    如何在GridView中新增按钮列
    使用GitHub/码云/Git个性化设置
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4510298.html
Copyright © 2020-2023  润新知