假设有输入、加工和输出3个并发进程共享一个缓冲区B,输入进程负责从输入设备读入一条记录,每读一条记录后把它存放在缓冲区B中,加工进程在缓冲区B中加工输入进程存入的记录。输出进程负责把加工后的记录打印输出。缓冲区B中每次只能存放一条记录,当记录被加工输出后,缓冲区B中才可存放下—条新记录。请用P、V操作来描述它们并发执行时能正确工作的程序。
解:
设4个变量。
mutex 代表是否有进程在使用B empty代表B是否为空,
full代表B是否有记录, handle代表记录是否被处理
Semaphore mutex = 1, empty = 1, full = 0, handle = 0;
//读入进程
void input () {
do {
wait( empty );
wait( mutex );
读入一条记录,每读一条记录后把它存放在缓冲区B中
signal( mutex );
signal( full );
} while( True )
}
// 加工进程
void process () {
do {
wait( full );
wait( mutex );
加工输入进程存入的记录
signal( mutex );
signal( handle );
} while( True )
}
// 输出进程
void process () {
do {
wait( handle );
wait( mutex );
加工后的记录打印输出
signal( mutex );
signal( empty );
} while( True )
}