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

使用监视器实现

华建同
2023-03-14

在使用监视器的餐饮哲学家实现中,为什么提出()操作两次调用test()操作?

procedure take_chopsticks(i)
  {
    DOWN(me);               
    pflag[i] := HUNGRY;
    test[i];
    UP(me);                 
    DOWN(s[i])                     }

void test(i)            
  {
    if ( pflag[i] == HUNGRY
      && pflag[i-1] != EAT
      && pflag[i+1] != EAT)
       then
        {
          pflag[i] := EAT;
          UP(s[i])
         }
    }

void drop_chopsticks(int i)
  {
    DOWN(me);                
    test(i-1);               
    test(i+1);               
    UP(me);                  
   }

共有1个答案

韩阳云
2023-03-14

它叫了两次,因为每根筷子都被认为是自己的资源。因此,你需要“信号()”,这两根筷子现在都可以单独拿取了。

我只研究这个问题的理论代码,但我不确定你引用的筷子“i-1”和“i1”是正确的。我需要查看您的初始化和代码的其余部分,但传统的解决方案通常将哲学家i的筷子称为(i 1)右筷子和(i 4)左筷子,在5个哲学家的情况下。

 类似资料:
  • 本文向大家介绍如何使用信号量实现监视器?,包括了如何使用信号量实现监视器?的使用技巧和注意事项,需要的朋友参考一下 为了使用信号量实现监视器,为每个监视器提供了一个信号量互斥锁(已初始化为1)。Wait(mutex)必须在进入监视器之前由进程执行,并且必须在离开监视器之后执行signal(mutex)。由于信令过程必须等待,直到恢复的过程离开或等待,所以引入了另一个信号量(下一步),初始化为0。信

  • 这一节我们编写一个监视器:EventLogMonitor ,也就是用来接收事件的程序,用来代替 netcat 。EventLogMonitor 做下面事情: 接收 LogEventBroadcaster 广播的 UDP DatagramPacket 解码 LogEvent 消息 输出 LogEvent 消息 和之前一样,将实现自定义 ChannelHandler 的逻辑。图13.4描述了LogEv

  • 监视电源状态的改变。 进程:主进程 在 app 模块发出 ready 事件之前, 您不能引用或者使用此模块。 例如: const electron = require('electron') const { app } = electron app.on('ready', () => { electron.powerMonitor.on('suspend', () => { conso

  • 我对JMX很陌生。我试图记录tomcat的统计数据,如使用的线程、缓存、会话和其他标准值。我正试图用java代码实现这一点。 到目前为止,我已经做了以下事情。(我正在尝试访问windows上本地tomcat 6.0监视器的值) 1) 我在catalina中添加了以下选项。bat set CATALINA_OPTS=-Dcom。太阳经营jmxremote-Dcom。太阳经营jmxremote。端口=

  • 我正在使用AzureJavaSDK。有没有办法使用SDK(如CPU和Memory)找出VM的使用指标? 我已经试过了 但这给了我整个地区的度量信息。有没有办法在VM的基础上获取指标?

  • 我正试图通过使用Mockito和监视对象,找出如何跳过单元测试中的非静态void方法调用。 正在讨论的类是: 我正在尝试的单元测试方法是: 在我的单元测试中,我尝试了下面概述的代码,但最终都在“doNot()”行之前抛出了Mockito错误(底部的详细错误): 错误: 任何帮助或建议将不胜感激!