Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Process 操作系统:首次读写器同步问题解决方案中的混乱_Process_Operating System_Synchronization_Semaphore - Fatal编程技术网

Process 操作系统:首次读写器同步问题解决方案中的混乱

Process 操作系统:首次读写器同步问题解决方案中的混乱,process,operating-system,synchronization,semaphore,Process,Operating System,Synchronization,Semaphore,我正在研究这本书中的第一读者-作者问题的解决方案,它描述了: 第一个读卡器-写卡器问题,要求除非写卡器已经获得使用共享对象的权限,否则任何读卡器都不能一直等待。换句话说,任何读者都不应该仅仅因为作者在等待而等待其他读者完成 我从中了解到的是,如果有一个读者在奔跑,一个作家来了;然后,该写入程序将被阻止,直到读卡器完成。但在第一个读卡器完成的过程中,如果出现另一个读卡器(或多个读卡器),则该读卡器将优先于编写器 首先,如果我错了,请纠正我。但是如果我是对的,那么我所理解的是,Reader的代码不能

我正在研究这本书中的
第一读者-作者问题的解决方案,它描述了:

第一个读卡器-写卡器问题,要求除非写卡器已经获得使用共享对象的权限,否则任何读卡器都不能一直等待。换句话说,任何读者都不应该仅仅因为作者在等待而等待其他读者完成

我从中了解到的是,如果有一个读者在奔跑,一个作家来了;然后,该写入程序将被阻止,直到读卡器完成。但在第一个读卡器完成的过程中,如果出现另一个读卡器(或多个读卡器),则该读卡器将优先于编写器

首先,如果我错了,请纠正我。但是如果我是对的,那么我所理解的是,
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);
现在假设发生以下事件序列:

  • 假设第一个读者来了,它在注释中提到的
    行02
    上阻止了作者
  • 然后一个编写器来了,它正在等待
    rw\u互斥
  • 然后,第一个读卡器正在执行代码注释中提到的代码行
    第03行
    ,并且它已经锁定了
    互斥
    信号量
  • 同时,第二个阅读器来了,它开始在代码注释中提到的第01行等待
  • 现在,当第一个读卡器执行第04行时;它释放了
    rw_互斥体上的锁
    ,在while循环中等待的写入程序现在被解锁并开始执行
  • 当第一个读卡器执行
    第04行
    之后发出信号的
    互斥量
    行时,第二个读卡器将解锁
现在,如果我们看到整个流程,那么
编写器在第二个读卡器之前运行。那么,代码逻辑的工作原理是否与上述相同


如果我错了,请纠正我。

是的,代码的工作原理与您理解的相同。您可以参考wiki页面,该页面具有您在讨论中包含的类似伪代码

Reader-Thread1释放rw_互斥锁后,Writer线程将立即获得该互斥锁。但正如您在用例中所解释的,这不会有什么问题


在第一个读写器问题中,如果进行了太多的读操作,写写写器可能会饿死。

这段代码来自哪里?这段代码摘自前面提到的书(即操作系统概念-第9版),这就是问题所在。大多数问题都是从那本书的废话中提出的,而不是从任何其他来源提出的。那代码毫无意义。