问答题 今有一个文件P供多个进程共享,现把这些进程分成A、B两组,规定同组进程可以同时读文件P,但当有A组(或B组)进程在读文件P时,就不允许B组(或A组)进程读文件P。试用C语言实现两组进程的读文件过程。
【正确答案】
【答案解析】程序示意如下:
Semaphore:S1,S2,mutex;
int:num1,num2;
S1=1;S2=1;mutex=1;num1=0;num2=0;
Process_A() {
P(S1);
num1=num1+1;
if(num1==1) then P(mutex);
V(S1);
读文件P;
P(S1);
num1=num1-1;
if(num1==0) then V(mutex);
V(S1);
}
Process_B() {
P(S2);
Num2=num2+1;
if(num2==1) then P(mutex);
V(S2);
读文件P;
P(S2);
Num2=num2-1;
if(num2==0) then V(mutex);
V(S2);
} [解析] 这是一个读者/写者类型的同步互斥问题。有A、B两组读者,但没有写者。两组读者相互竞争对文件P的读权限,而读权限在同组进程之间是共享的,因此,在到达临界区(即“读文件P”)的同组进程中,由第一个到达进程负责竞争临界区的入场券(即“读权限”),由最后一个离开进程负责释放临界区的入场券。因此需要使用一个互斥信号量mutex,实现A、B两组读者互斥地进入临界区。
为了确定第一个到达的进程和最后一个离开的进程,需要定义两个计数器num1和num2,分别记录A组和B组中需要或正在读文件P的进程数。计数器在同组进程之间是共享资源,需要互斥地访问。因此,每组进程需要使用一个互斥信号量(S1、S2),保证对计数器进行正确的并发操作。