生产者消费者信号量的个人理解

使用buffer存储生产者生产的东西
int enpty = n;//buffer中空的位置
int full = 0;//buffer中能消费的位置
int mutex = 1//互斥量
生产者{
p(empty);
//生产物质
p(mutex)
//使用互斥锁,保证临界区在一个时间段是能让一个进程访问
v(mutex)//退出临界区
v(full)//每次生产一件物质full都需要加一,并且唤醒等待消费的进程
}


消费者{
p(full)//判断buffer中是否有物质可用
p(mutex)//上锁
消费
v(mutex)//
v(empty)//如果empty<=0,那么唤醒生产者进程
}

如果调换生产者两个p操作位置

生产者{
p(mutex)
//使用互斥锁,保证临界区在一个时间段是能让一个进程访问

p(empty);
//生产物质

v(mutex)//退出临界区
v(full)//每次生产一件物质full都需要加一,并且唤醒等待消费的进程

}
此时如果生产者生产过快,导致empty为0,再次生产时p(mutex)可以上锁,mutex 变为0;此时由于empty == 0;生产者进程进入阻塞状态,此时消费者进程由于mutex == 0:后面的语句无法执行,这样消费者进程也进入阻塞,导致两个进程死锁。

 这是信号量的P、V操作,baiP表示申请一个资源du,每次P操作使信号量减1,V是释放一个资源,每次V操作使信号量加1。信号量表示的是当前可用的资源个数,当信号量为负时,申请资源的进程就只能等待了。所以,信号量是负的多少,就表明有多少个进程申请了资源但无资源可用只能处于等待状态。当信号量为1时变成了互斥锁,当信号量大于一时,表明进程可以访问被信号量保护的临界区

原文地址:https://www.cnblogs.com/guosai1500581464/p/13179992.html