步骤
1.定义变量
代码如下:
int n;
semaphore mutex=1;//互斥
semaphone empty=n;//空的缓冲区数量,一开始全空,有n个位置可以进行生产
semaphore full=0;//满的缓冲区数量,一开始没有产品
2.生产者进程结构
代码如下:
do{
...
/*生产产品*/
...
wait(empty);//等到empty缓冲区有空闲位置(大于0),可以进行生产
wait(mutex);//修改信号量为0,防止其他进程运行
...
/*将生产的产品添加到缓冲区*/
...
signal(mutex);//修改信号量为1,释放cpu
signal(full);//full缓冲区增加一个产品
}while(true);
3.消费者进程结构
代码如下:
do{
wait(full);//等到full缓冲区有产品可以消费
wait(mutex);//修改信号量为0,防止其他进程运行
...
/*发现有产品可以消费,从缓冲区移除*/
...
signal(mutex);//修改信号量为1,释放cpu
signal(empty);//消费完一个产品,empty缓冲区增加一个空闲位置
...
/*消费完产品*/
...
}while(true);
总结
empty和full这两个变量用来判断唤醒的是哪个进程,并且避免死锁发生