从通道接收消息作为保护

时间:2017-03-23 21:30:47

标签: spin promela

A: if
   :: q?a -> ...
   :: else -> ...
   fi
  

请注意,此类代码内置竞争条件。多久   如果进程等待,例如,在决定之前   消息接收操作不可执行?问题可能是   通过使用消息轮询操作来避免,例如,如下所示:

上述引文来自http://spinroot.com/spin/Man/else.html

我无法理解这种论证。 Just Spin可以决定q?a: 如果q为空,那么它是可执行的。否则,它是阻塞的。

给定的论点引发了竞争条件。

但是,我可以提出同样的论点:

byte x = 1;
A: if 
   :: x == 2 -> ...
   :: else -> ...
   fi

从Spin的观点来看,这是可以的。但是,我问,例如,在决定x的值不会被其他进程增加之前,该进程应等待多长时间?

1 个答案:

答案 0 :(得分:1)

关于Promela的语义和选择结构的论证是合理的。请注意,对于选择,如果多个保护语句是可执行的,则将非确定性地选择其中一个。这反过来意味着语义使得选择(即使它可以非确定地执行保护)需要在调用选择语句时确定哪些保护是可执行的

在考虑选择和消息接收的语义时,关于竞争条件的问题可能更有意义。请注意,在这种情况下,竞争条件意味着选择的输出可能取决于它需要调用接收的时间(即它是否在其中有消息的位置结束)通道与否)。 更具体地说,对于选择陈述,在可行的保护方面应该没有歧义。现在,只有当通道不为空时,消息接收才会从通道获取消息(否则,它无法完成执行并等待)。因此,关于接收的语义,不清楚它是否在实际执行之前是可执行的。反过来,如果接收不可执行,则应执行else。但是,由于else仅在?不可执行时才应执行,因此要知道else是否可执行,程序需要知道未来(或确定应该等多少才能知道这一点)因此招致竞争条件)。

请注意,该参数不适用于您的第二个示例:

byte x = 1;
A: if 
   :: x == 2 -> ...
   :: else -> ...
   fi

因为在这里,要回答else是否合格,不需要等待(也不知道未来),因为程序可以在任何时候确定是否x == 2