同步 互斥体和信号量

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

原文地址:https://www.cnblogs.com/nzbbody/p/4510298.html