一、fork与互斥锁
![](https://i-blog.csdnimg.cn/blog_migrate/5481d07afcef703950b83594ab523533.png)
——Linux高性能服务器编程14.8.2
判断父子线程fork之后,是否使用的同一个锁,首先我们看一段代码
![](https://i-blog.csdnimg.cn/blog_migrate/e865b6523b48ee0db0552743c07c7922.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/17f0ec26390e9515d9ddfbe23d810a8f.png)
根据上图我们发现,子进程变为阻塞状态,所以验证了进行fork之后,父子进程使用的不是同一个锁,如果使用的是通一个锁,此时等待5s后,子进程会输出加锁成功。但是程序为什么会成为阻塞状态呢?原因是当我们fork之后子进程将父进程的加锁状态也复制进去,此时子进程已经成为加锁状态,所以在一次上锁,程序变成阻塞状态。那么如何解决这个问题?我们需要保证fork之后,父子进程都有一个清楚的锁状态
![](https://i-blog.csdnimg.cn/blog_migrate/4a8394ca6494729635f3bdb3e42ac7b3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6099408bdc823ff3ceba02a5cb2bb99a.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/4ff9bf8180fcdd233e173b31f52eae8e.png)
二、生产者消费者问题
![](https://i-blog.csdnimg.cn/blog_migrate/1ec8389185a0bada07d6518d6cea21f3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/43f3da89b12c830a4b504dcf4bcfce5a.png)
生产者消费者模型的实现
假定缓冲池中有N个缓冲区,一个缓冲区只能存储一个int类型的数据。定义互斥锁mutex实现对缓
冲区的互斥访问;计数信号量dempty用来表示空闲缓冲区的数量,其初值为N;计数信号量dfull用来表示有数据的缓冲区的数量,其初值为0。
思考:先加锁还是先执行p操作?
答案先执行p操作,原因当我们先加锁的时候当缓冲区已满的时候,此时生产者p操作阻塞,消费者也上不了锁,程序变为死锁状态。
示意图:
![](https://i-blog.csdnimg.cn/blog_migrate/c92e404759d8c241e92bde1a9df5c355.png)
代码执行:
![](https://i-blog.csdnimg.cn/blog_migrate/906e98c311317b9d599a65766850d424.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6a58d9eb44f218cd8d91fd3e6f659025.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3c629b4c95eb2565679807921567aa67.png)