参考:

https://blog.csdn.net/benjamin721/article/details/50703692(进程/线程通信:信号量和互斥量总结)

https://blog.csdn.net/qq_46275568/article/details/120630019(信号量及其应用)

https://www.jianshu.com/p/6674400a98b2(信号量与PV操作)

信号量的引入

由于对互斥量的操作在cpu执行时不是原子性的,如果多个进程/线程同时访问互斥量,被cpu分解为一个一个指令时有重叠,就会出问题。由此引入信号量!

信号量:

信号量s是非负整数值的全局变量。只能有两种特殊的操作,这两种操作称为P和V

P(s):如果 s 是非零的,那么 P 将 s 减 1,并且立即返回。
如果 s 为零,那么就挂起这个线程,直到 s 变为非零,而一个 V 操作会重启这个线程。
在重启之后, Р 操作将 s 减 1,并将控制返回给调用者。 V(s): V 操作将 s 加 1
如果有任何线程阻塞在 Р 操作等待s变成非零,那么 V 操作会重启这些线程中的一个,然后该线程将 s 减 1,完成它的 Р 操作。
 
操作系统:进程通信-信号量和互斥量

 

用PV操作解决并发互斥问题

操作系统:进程通信-信号量和互斥量

用PV操作,解决进程间互斥问题有以下4点:
1.划定临界区
2.对多个进程的临界区,设定一个信号量mutex。mutex这个信号量,初值为1。
简单说明一下mutex,mutex是常用于解决互斥问题的时候所定义的一个信号量变量。是互斥(mutual exclusion)的缩写。现在已经形成一种约定俗成的互斥的命名。
3.在临界区前实施P(mutex)
4.在临界区之后实施V(mutex)

 

 

信号量与互斥锁的区别:

1. 互斥锁用于线程的互斥,信号量用于线程的同步

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

2. 互斥锁量值只能为0/1,信号量值可以为非负整数。

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

 

相关文章: