问答题
我们将只读数据的进程称为“读者”进程,而写或者修改数据的进程称为“写者”进程,允许多个“读者”同时读数据,但不允许写者与其他读者或者写者进程同时访问数据。另外要保证:一旦有写者等待,新到达的读者必须等待,直到该写者完成数据访问为止,用PV操作实现读者、写者同步。【北京航空航天大学2005年】
【正确答案】正确答案:这是一个“写优先”的读者.写者问题。在经典的“读优先”的读者一写者问题的PV操作中,只要再增加一个信号量w=1,用以在写进程到达时封锁后续进程,即可实现“写优先”。 int count=0; //用于记录当前的读者数量 semaphore mutex=1; //用于保护更新count变量时的互斥 semaphore rw=1; //用于保证读者和写者互斥地访问文件 semaphore w=1j //于实现“写优先” writer(){ //者进程 while(1){ P(W); P(rw); writing V(rw), V(W); } } reader(){ //读者进程 while(1){ P(w); p(mutex); if(count==0) //若当前没有读者在读文件 P(rw), //申请读文件 COUnt++; V(mutex); V(w); reading P(mutex); count一一; if(count==0) V(rw); V(mutex), } } 注:读者.写者问题是经典的PV题。这里的代码应该熟记。“写优先”的代码只是在“读优先”的基础上各增加一对PV操作,这一点应注意。
【答案解析】