int mutex=l /*对有界缓冲区进行操作的互斥信号量* mal regin ducer i() /*=1,2,…,m:j=1,2,…,k*/ consumer j() producer() /*=1,2 while(生产未完成) 生产一个产品 p(mutex); 送一个产品到有界缓冲区; V(fu11); consumers() /*j=1,2,…,k*/ while(还要继续消费) 从有界缓冲区中取产品 V(mutex 消费一个产品 (5)读者与写者问题 在计算机系统中,有些文件是可共享的,当若干个并发进程都要访问某个共享文件时,应 区分是读还是写(修改)文件。显然可允许多个进程同时读文件但不允许在进程读文件时让另 一进程去修改文件,或者有进程在修改文件时让另一进程去读,否则会造成读出的文件内容不 正确。尤其是绝对不允许多个进程同时修改同一文件。这样一类问题称为"读者一写者"问题 为了实现读者与写者的同步和互斥,我们设置一个信号量S,用于读者与写者之间或写者 与写者之间的互斥,初值为"1"。用一个变量rc表示当前正在读的读者个数,当进程可以去读 或读结束后都要改变re的值,因此rc又成为若干读进程的共享变量,它们必须互斥地修改 rc。故必须定义另一个用于互斥的信号量Sr,初值也是"1"。读者一写者问题可描述如下 var S, Sr: semaphore: =1, 1 rc: Interger rc Parbeginint mutex=1; /*对有界缓冲区进行操作的互斥信号量*/ main( ) { Parbegin producer i( ); /*i=1,2,…,m:j=1,2,…,k*/ consumer j( ); parend } produceri( ) /*i=1,2,…,m*/ { while (生产未完成) { 生产一个产品; p(empty); p(mutex); 送一个产品到有界缓冲区; V(mutex); V(full); } } consumerj( ) /*j=1,2,…,k*/ { while (还要继续消费) p(full); p(mutex); 从有界缓冲区中取产品; V〈mutex〉; v(empty); 消费一个产品; } } (5)读者与写者问题 在计算机系统中,有些文件是可共享的,当若干个并发进程都要访问某个共享文件时,应 区分是读还是写(修改)文件。显然可允许多个进程同时读文件但不允许在进程读文件时让另 一进程去修改文件,或者有进程在修改文件时让另一进程去读,否则会造成读出的文件内容不 正确。尤其是绝对不允许多个进程同时修改同一文件。这样一类问题称为"读者一写者"问题。 为了实现读者与写者的同步和互斥,我们设置一个信号量 S,用于读者与写者之间或写者 与写者之间的互斥,初值为"1"。用一个变量 rc 表示当前正在读的读者个数,当进程可以去读 或读结束后都要改变 rc 的值,因此 rc 又成为若干读进程的共享变量,它们必须互斥地修改 rc。故必须定义另一个用于互斥的信号量 Sr,初值也是"1"。读者一写者问题可描述如下: var S,Sr:semaphorep:=1,1; rc:interger; rc:=0; Parbegin