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
的值不会被其他进程增加之前,该进程应等待多长时间?
答案 0 :(得分:1)
关于Promela的语义和选择结构的论证是合理的。请注意,对于选择,如果多个保护语句是可执行的,则将非确定性地选择其中一个。这反过来意味着语义使得选择(即使它可以非确定地执行保护)需要在调用选择语句时确定哪些保护是可执行的。
在考虑选择和消息接收的语义时,关于竞争条件的问题可能更有意义。请注意,在这种情况下,竞争条件意味着选择的输出可能取决于它需要调用接收的时间(即它是否在其中有消息的位置结束)通道与否)。
更具体地说,对于选择陈述,在可行的保护方面应该没有歧义。现在,只有当通道不为空时,消息接收才会从通道获取消息(否则,它无法完成执行并等待)。因此,关于接收的语义,不清楚它是否在实际执行之前是可执行的。反过来,如果接收不可执行,则应执行else
。但是,由于else
仅在?
不可执行时才应执行,因此要知道else
是否可执行,程序需要知道未来(或确定应该等多少才能知道这一点)因此招致竞争条件)。
请注意,该参数不适用于您的第二个示例:
byte x = 1;
A: if
:: x == 2 -> ...
:: else -> ...
fi
因为在这里,要回答else
是否合格,不需要等待(也不知道未来),因为程序可以在任何时候确定是否x == 2
。