我無法繞過這個PROMELA問題:我有N個進程(「pc」)可能通過通道(「to_pc」)發送和接收消息。每個進程都有自己的通道,通過它可以接收消息。 對於一個能夠接收的進程,我必須將它保存在一個循環中,該循環檢查傳入消息的通道。作爲第二個循環選項,該過程向所有其他渠道發送消息。如何在沒有超時/死鎖的情況下在PROMELA進程中發送和接收?
但是,在仿真模式下,這總是會導致超時,根本沒有發送任何內容。到目前爲止,我的理論是我創建了一個死鎖,所有進程都希望一次發送,導致它們都無法接收(因爲它們被卡在代碼的「發送」部分)。
到目前爲止,我一直無法解決這個問題。我曾嘗試使用全局變量作爲信號來「禁止」發送,因此只有一個通道可以發送。但是,這並沒有改變結果。我唯一的想法是使用超時作爲發送的觸發器,但這對我來說似乎並不正確。
任何想法?提前致謝!
#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
};
謝謝你的詳細解答。它實際上解決了我描述的問題。現在我只需要找到一種方法來設置消息內容發送之前。在這個例子中它基本上是不變的,但我簡化了它以堅持這個問題。無論如何,再次感謝。 –
@ K.Huber爲每個'out!stuff'語句提供了一個'else',s.t. 'else'會讓你回到'main loop'的開頭,並且每當你回到'send'時,你從最新的索引'j'恢復,你可以發送而不是從頭開始。通過這種方式,每次*發送*都不能執行,您有機會評估是否可以完成*接收*。 –
在驗證模式下運行時,是不是會導致「可能與else組合使用可疑」錯誤? –