当前位置: 首页 > 知识库问答 >
问题:

如何在读写器解决方案中导致写器优先级失败?

马侯林
2023-03-14

我感兴趣的是在readers/writers信号量解决方案中导致失败,并具有writers优先级。

以下代码摘自维基百科:

    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 performed

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

...有一个二进制信号量mutex_3,它限制试图访问r信号量的线程数量,以便写入程序具有优先级。

我试图移除互斥锁,期待作家挨饿,但没有成功。我用Java写了一个程序,其中线程等待固定的时间两次:在读取/写入之后和期间。我创建了一个写手进程和8个阅读器进程,并将等待量设置为1毫秒。我试图创造一种情况,其中r信号量不断受到一个作者和许多读者的攻击。这些都没有造成我预期的失败。

我做错什么了吗?我怎么能让作家挨饿呢?

共有1个答案

燕星鹏
2023-03-14

在这个问题中-来自维基百科-

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 performed

  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);

在实践中很难让读者挨饿,但在理论上,他们可以。

问题是,作者比读者有优先权,所以如果你一直有作者来,读者将永远等待执行

希望有帮助!

 类似资料:
  • 我正在尝试用play vars_prompt变量重写inventory group_vars/all变量。考虑下面的代码: inventory/group_vars/all.yml test.yml 我想用var1和var2(用vars_prompt接受的值)代替test1和test2(在inventory/group_vars/all.yml中设置的值)重写variable_1和variable

  • 我在Java使用PriorityQueue。 我有一个结构如下的对象: 优先考虑的是从最便宜到最贵的成本: 我使用add将对象包含在队列中。 它适用于队列中的每个元素,但我添加的最后一个元素总是位于底部。 我做错了什么?

  • 从操作系统概念 在第一个读写器问题的解决方案中,读写器进程共享以下数据结构: 图5.11编写器进程的结构。 图5.12阅读器进程的结构。 信号量和初始化为1;读取计数初始化为0。信号量对于读取和写入进程都是通用的。信号量用于确保变量读取计数更新时的互斥。读取计数变量跟踪当前有多少进程正在读取对象。信号量作为编写器的互斥信号量。进入或退出临界段的第一个或最后一个读取器也使用它。当其他读者在他们的关键

  • 我正在研究《操作系统概念》(第9版)一书中的 上的作者 然后一个作家来了,正在等待 然后第一个阅读器执行代码中注释中提到的代码行,并锁定了信号量 与此同时,第二个阅读器来了,它开始等待代码中注释中的第01行 现在,当第一个读取器执行时;它释放了对的锁,并且在其同时循环中等待的写入器现在被解锁并开始执行 当第一个读取器执行之后的行时,第二个读取器将被解锁,该行发出信号信号量 现在,如果我们看到整个流

  • 问题内容: 像这样的组合器优先吗? (注之间的空间,并为后代组合子) 还是从左到右阅读,就像 ? 问题答案: 不,在组合器中没有优先级的概念。但是,在复杂的选择器中存在元素顺序的概念。 可以从对您有意义的任何方向读取任何复杂的选择器,但这并不意味着组合器是分布式的或可交换的,因为它们表示两个元素(例如和)之间的关系。这就是为什么元素顺序很重要的原因。 但是,根据Google的说法,浏览器实现了其选

  • 本文向大家介绍iOS 解决UILabel优先级冲突,包括了iOS 解决UILabel优先级冲突的使用技巧和注意事项,需要的朋友参考一下