我无法解决这个 PROMELA 问题:我有 N 个进程(“pc”),它们可以通过通道(“to_pc”)发送和接收消息。每个进程都有自己的接收消息的通道。为了使进程能够接收,我必须将其保持在一个循环中,以检查通道是否有传入消息。作为第二个循环选项,该过程将消息发送到所有其他通道。
但是,在模拟模式下,这总是会导致超时,根本没有发送任何内容。到目前为止,我的理论是我创建了一个死锁,所有进程都想同时发送,导致它们都无法接收(因为它们被困在代码的“发送”部分)。
到目前为止,我一直无法解决这个问题。我尝试使用全局变量作为信号量来“禁止”发送,这样只有一个通道可以发送。然而,这并没有改变结果。我唯一的另一个想法是使用超时作为发送的触发器,但这对我来说似乎根本不对。
有任何想法吗?提前致谢!
#define N 4
mtype={request,reply}
typedef message {
mtype type;
byte target;
byte sender;
};
chan to_pc[N] = [0] of {message}
inline send() {
byte j = 0;
for (j : 0 .. N-1) {
if
:: j != address ->
to_pc[j]!msg;
:: else;
fi
}
}
active [N] proctype pc(){
byte address = _pid;
message msg;
do
:: to_pc[address]?msg -> /* Here I am receiving a message. */
if
::msg.type == request->
if
:: msg.target == address ->
d_step {
msg.target = msg.sender
msg.sender = address;
msg.type = reply;
}
send();
:: else
fi
:: msg.type == reply;
:: else;
fi
:: /* Here I want to send a message! */
d_step {
msg.target = (address + 1) % N;
msg.sender = address;
msg.type = request;
}
send();
od
};