同步互斥经典问题
生产者-消费者问题
实现互斥是在同一个程序的不同进程
实现两个进程的同步关系,是在其中一个执行申请资源操作P,另外一个进程执行释放资源V
实现互斥的申请资源操作P要在实现同步的申请资源P操作之后,否则会引发死锁
问题背景
系统中有多个生产者进程,多个消费者进程,生产者进程每次生产一个产品放在缓冲区,消费者每次从缓冲区取出产品并消耗
假设缓冲区最多只能放n个产品
伪代码实现
semaphore mutex = 1;//进程互斥访问缓冲区,包括生产者—生产者(避免数据覆盖),消费者—消费者(避免资源重复),生产者—消费者(不是互斥信号量解决,由同步信号量解决)
semaphore empty = n;//同步信号量,表示缓冲区大小
semaphore full = 0;//同步信号量,表示产品数量,注意 empty + full = n
//生产1个产品
void producer(){
while(1){
P(empty);
P(mutex);
把产品放入缓冲区
V(mutex);
V(full);
}
}
//消耗1个产品
void consumer(){
while(1){
P(full);
P(mutex);
从缓冲区取出产品
V(mutex);
V(empty);
}
}
多生产者-多消费者问题
互斥关系1种
盘子是临界资源,某个时刻只允许1个进程访问
同步关系3种
只有父亲放苹果到盘子上,女儿才能拿到苹果
只有母亲放橘子到盘子上,儿子才能拿到橘子
只有盘子为空,父亲or母亲才能操作
semaphore mutex = 1;//进程互斥
semaphore apple = 0;//资源1
semaphore orange = 0;//资源2
semaphore plate =2;//资源3 盘子能装几个水果
dad(){
while(1){
准备1个苹果
P(plate);//申请使用1个盘子
P(mutex);
把苹果放在上面
V(mutex);
V(apple)
}
}
mom(){
while(1){
准备1个橘子
P(plate);//申请使用1个盘子
P(mutex);
把橘子放在上面
V(mutex);
V(orange)
}
}
son(){
while(1){
P(orange);//检查消耗掉1个橘子
P(mutex)
释放盘子资源
V(mutex)
V(plate)
}
}
daughter(){
while(1){
P(apple);//检查消耗掉1个苹果
P(mutex)
释放盘子资源
V(mutex)
V(plate)
}
}