操作系统:解决第一个读者 - 作家同步问题的解决方案

时间:2016-03-14 16:41:32

标签: process operating-system synchronization semaphore

我正在从Operating System Concepts (9th edition)一书中研究First Readers - Writers Problem的解决方案,它描述了:

  

第一个读者 - 编写者问题,要求除非作者已经获得使用共享对象的许可,否则不会让读者等待。换句话说,没有读者应该等待其他读者完成,因为作家正在等待。

我从中得到的理解是,如果有任何读者在跑,而作家来了;那个作家将被阻止,直到读者完成。但是在第一个读者完成时,如果有另一个读者(或多个读者),则那些(那些)读者将优先于作者。

首先,如果我在这里错了,请纠正我。但如果我是对的,那么我所理解的是,Reader的代码并不能保证这一点。

读写器代码如下:

//data structures
semaphore rw_mutex = 1;
semaphore mutex = 1;
int read_count = 0;

//Code for writer
do {
   wait(rw_mutex);
   . . .
   /* writing is performed */
   . . .
   signal(rw_mutex);
} while (true);

//Code for reader
do {
   wait(mutex);            //Line 01
   read_count++;

   if (read_count == 1)
      wait(rw_mutex);      //Line 02

   signal(mutex);
   . . .
   /* reading is performed */
   . . .

   wait(mutex);            //Line 03
   read_count--;

   if (read_count == 0)
      signal(rw_mutex);    //Line 04

   signal(mutex);
} while (true);

现在假设发生以下事件序列:

  • 假设第一个读者来了,它会阻止作者在评论
  • 中提到的Line 02
  • 然后是一位正在等待rw_mutex
  • 的作家
  • 然后第一个读者正在代码中的注释中执行Line 03中提到的代码行,它已锁定mutex信号量
  • 同时第二位读者来了,它开始在代码中的评论中以Line 01提及等待
  • 现在,当第一个读者执行Line 04时;它释放rw_mutex上的锁定,正在等待其while循环的编写器现在解锁并开始执行
  • 当第一个读卡器执行Line 04信号mutex信号量
  • 之后的行时,第二个读卡器将被解锁

现在,如果我们看到整体流量,那么the writer runs before the second reader。那么代码逻辑的工作方式与上述相同吗?

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

是的,代码将与您理解的相同。您可以参考wiki页面here,其中包含您所包含的类似伪代码。

Writer线程将在Reader-Thread1释放后立即获取rw_mutex。但正如您在用例中所解释的那样,这没有任何问题。

在First-reader writer问题中,如果正在进行过多的读取操作,则编写者可能会受到匮乏。