Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 读写器的第二种算法求解_Algorithm_Concurrency_Synchronization - Fatal编程技术网

Algorithm 读写器的第二种算法求解

Algorithm 读写器的第二种算法求解,algorithm,concurrency,synchronization,Algorithm,Concurrency,Synchronization,我很难理解读者-作者问题的第二种算法。我理解一般的概念,即作者将优先于读者(读者可能会挨饿)。我甚至理解这个算法的条件变量实现。然而,信号量和互斥实现对我来说毫无意义。这是维基百科的一个例子: int readcount, writecount; (initial value = 0) semaphore mutex 1, mutex 2, mutex 3, w, r ; (initial value = 1) READER P(mutex 3); P(r); P(mu

我很难理解读者-作者问题的第二种算法。我理解一般的概念,即作者将优先于读者(读者可能会挨饿)。我甚至理解这个算法的条件变量实现。然而,信号量和互斥实现对我来说毫无意义。这是维基百科的一个例子:

int readcount, writecount; (initial value = 0)
semaphore mutex 1, mutex 2, mutex 3, w, r ; (initial value = 1)

READER
  P(mutex 3);
    P(r);
      P(mutex 1);
        readcount := readcount + 1;
        if readcount = 1 then P(w);
      V(mutex 1);
    V(r);
  V(mutex 3);

  reading is done

  P(mutex 1);
    readcount := readcount - 1;
    if readcount = 0 then V(w);
  V(mutex 1);


WRITER
    P(mutex 2);
      writecount := writecount + 1;
      if writecount = 1 then P(r);
    V(mutex 2);

  P(w);
    writing is performed
  V(w);

  P(mutex 2);
    writecount := writecount - 1;
    if writecount = 0 then V(r);
  V(mutex 2);

[http://en.wikipedia.org/wiki/Readers-writers_problem][2]

我不明白读卡器锁中的三个信号量(互斥3、r和互斥1)是用来做什么的。一个信号量不够读取计数吗?

看看,这是维基百科代码的参考。它解释了为什么需要所有的互斥锁。

mutex 1
保护
readcount
变量
mutext2
保护
writecount
变量;mutex
r
保护读取操作,mutext
w
保护写入操作

1) 让我们假设一位作家进来:

向互斥2发送信号,并递增写入计数,以说明额外的写入器(自身) 由于它是唯一可以更改
writecount
(因为它持有
mutex 2
)的进程,因此它可以安全地测试它是否是唯一的写入程序(
writecount==1
),如果为真,它会发出mutex
r
,以防止读卡器进入其他写入程序(
writecount>1
)可以享受已发出信号的互斥锁
r

然后,写入程序向互斥对象发出信号
w
,以保护其更改不受其他(并发)写入程序的影响

最后一个writer(
writecount==1
)释放互斥锁
r
,让读卡器执行任务

2) 让我们假设一个读者进来:

发出信号
mutex 3
,以保护读卡器的设置逻辑不受其他读卡器的影响;然后向互斥锁发出信号
r
以防止其他写入程序(请记住,
r
在写入程序运行时发出信号);然后向互斥锁1发出信号以保护readcount(来自可能正在退出的其他读卡器),如果它是第一个读卡器(
readercount==1
),则向互斥锁发出信号以保护其不受写入程序的影响(现在将写入程序排除在执行其操作之外)

阅读可以并行进行,因此在阅读时不需要其他读者的保护(请记住,此时保持互斥
w
,因此不需要作者的干涉)

然后,最后一个读卡器重置写入互斥锁(
w
)以允许写入



防止编写器饥饿的诀窍是,编写器伪装成读卡器(当发送互斥信号时),因此即使有很多读卡器,也有很好的机会安排时间。另外,
mutex 3
防止了太多的读者等待mutex
r
,因此作者来时有很好的机会发出信号
r

请您发布算法或维基百科页面的链接,以确保我们都在看同一件事吗?谢谢阿提拉的解释。写的部分很有道理,但读的部分我还是不清楚。也许为了更好地理解这一点,您可以解释如果没有互斥3和互斥1信号量(只有r信号量保留以保护读取计数)?读取计数由
mutex 1
保护
mutex 3
用于将等待
r
的并发读卡器数量限制为1(以防止写入程序饥饿)
r
用于协调读写器之间的访问