model-checking - Promela channel "??"删除命令

标签 model-checking promela spin

谁能给我解释一下下面发生的事情的顺序?

if
 :: a_channel??5 -> // do A
 :: value_1 == value_2 -> // do B
fi;

所以基本上我的理解是,要使语句可执行,5 需要在 channel 中。我知道 5 将因此从 channel 中删除(如果它确实在 channel 中)。我不明白的是什么时候 5 会被删除。 5 是在语句执行后被移除还是在检查执行前被移除。

用于接收的 Promela 引用链接:http://spinroot.com/spin/Man/receive.html

最佳答案

假设 a_channel??5 包含在某个进程 P_i 的主体中。

Will 5 be removed after the statement is executed or will it be removed before during the check for execution.

“执行检查” 是从 channel 中删除 5 的必要条件,但不是充分条件。另一个必要条件是 P_i 被选中执行并执行语句 a_channel??5


更详细的答案。

声明 a_channel??5 声明它并不总是可执行。它可执行 5 在 channel 中时。 (例如如果 5 在 channel 中,但它已被移除 [例如被其他人],a_channel??5 是不再可执行)

每次进程 P_i 执行一个原子(一组)指令后,调度程序可能会决定抢占它并允许其他进程P_j 带有一些可执行 指令以继续。

当进程P_i 到达不可执行 语句时,它总是立即被调度器抢占。在这种情况下,如果没有其他进程 P_j 有一些立即可执行指令可以安排执行(即著名的“无效结束状态”错误)

如果语句 a_channel??5 是可执行的并且进程 P_i 被选择执行(或继续执行),则 a_channel??5 原子地 执行,并立即从 channel 中删除值5(第一次出现)

关于model-checking - Promela channel "??"删除命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464892/

相关文章:

Promela 中的缓存模型

multithreading - 如何加入Promela中的流程?

alloy - 在 Alloy 中分发代币

idris - 强类型函数式编程语言中模型检查的相关性?

Promela/Spin 中 C 包含的 Python 文件 : 'inline text too long'

process - proctype "-end-"中未达到自旋

c - 在 CBMC 中表达 “exactly once” 的更好方法

concurrency - 错误: VECTORSZ is too small

model-checking - 在 SPIN ltl 公式中使用 ne(X)t 运算符