私はSpinでアルゴリズムをモデリングしています。 私はいくつかのチャンネルを持っているプロセスを持っています。そしてある時点で、メッセージが来るが、どのチャンネルからメッセージが来るのか分からないことを知っています。したがって、メッセージがいずれかのチャネルから来るまでプロセスを待機(ブロック)したい。どうやってやるの?PROMELA/SPINの 'any'チャンネルからメッセージを受け取る方法
2
A
答えて
3
プロンプラのif構造が必要だと思います(http://spinroot.com/spin/Man/if.html参照)。
あなたが参照しているプロセスでは、あなたはおそらく以下のものが必要です。
byte var;
if
:: ch1?var -> skip
:: ch2?var -> skip
:: ch3?var -> skip
fi
チャンネルのどれもが彼らに何も持っていない場合は、「選択はブロック全体としての構築は、」(手を引用)、これはまさにあなたが望むふるまいです。
"[各::行]オプションは、そのガードステートメントが実行可能な場合にのみ実行するように選択することができます[ガードステートメントは、 ]複数のガードステートメントが実行可能な場合、そのうちの1つは非決定論的に選択されます。ガードが実行可能でない場合、選択構造全体がブロックされます。
ところで、私は上記のSpinで構文チェックやシミュレーションを行っていません。うまくいけばそれは正しい。私はプロメラとスピンには全く新しいです。
0
センドの実装を変更し、部品を受信することなく、チャンネル変数のあなたの番号を持っているしたい場合は、以下の生産者 - 消費者の例のアプローチを使用することがあります:
#define NUMCHAN 4
chan channels[NUMCHAN];
init {
chan ch1 = [1] of { byte };
chan ch2 = [1] of { byte };
chan ch3 = [1] of { byte };
chan ch4 = [1] of { byte };
channels[0] = ch1;
channels[1] = ch2;
channels[2] = ch3;
channels[3] = ch4;
// Add further channels above, in
// accordance with NUMCHAN
// First let the producer write
// something, then start the consumer
run producer();
atomic { _nr_pr == 1 ->
run consumer();
}
}
proctype consumer() {
byte var, i;
chan theChan;
i = 0;
do
:: i == NUMCHAN -> break
:: else ->
theChan = channels[i];
if
:: skip // non-deterministic skip
:: nempty(theChan) ->
theChan ? var;
printf("Read value %d from channel %d\n", var, i+1)
fi;
i++
od
}
proctype producer() {
byte var, i;
chan theChan;
i = 0;
do
:: i == NUMCHAN -> break
:: else ->
theChan = channels[i];
if
:: skip;
:: theChan ! 1;
printf("Write value 1 to channel %d\n", i+1)
fi;
i++
od
}
do
ループコンシューマープロセスでは、0
とNUMCHAN-1
の間のインデックスを非確定的に選択し、読み取るべきものがあれば、それぞれのチャネルから読み取ります。そうでなければ、このチャネルは常にスキップされます。もちろん、Spinを使ったシミュレーションでは、チャネルNUMCHAN
から読み取る確率はチャネル0
のそれよりもはるかに小さいですが、これは可能なパスを調べるモデル検査では何の違いもありません。
関連する問題
- 1. rabbitmqチャンネルからjava NIOチャンネルへのメッセージの受け渡し
- 2. nodejsのRabbitMQからメッセージを受け取る方法
- 3. Outlookから最新のメッセージを受け取る方法
- 4. Gmail Webhooksから最近のメッセージを受け取る方法は?
- 5. 自己ホストカスタムMicrosoftチームからメッセージを受け取る方法は?
- 6. Glassfish(v3)JMSキューからメッセージを受け取る方法
- 7. phonegapプラグインからアンドロイド・サービス・リターン・メッセージを受け取る方法
- 8. IFTTTからJavaコードへのメッセージを受け取る方法とその逆
- 9. JMSTemplateとセレクタを使ってActiveMQからメッセージを受け取る方法は?
- 10. ボットのメッセージの後にユーザーからのメッセージを受け入れる方法は?
- 11. コンテンツスクリプトからpopup.js/htmlに送信されたメッセージを受け取る方法は?
- 12. MUC室でメッセージを受け取った人を知る方法
- 13. 壁からメッセージを受け取るためのFacebookの特典
- 14. 受信メッセージからMSMessageサマリーテキストを取得する方法?
- 15. 受信トレイからメッセージを読み取る方法
- 16. RabbitMQ - 自分のメッセージを受け取らないようにする方法
- 17. CLプログラムでメッセージを受け取る方法は?
- 18. DjangoアプリケーションでRabbitMQメッセージを受け取る方法は? (セロリ?)
- 19. boost :: asio UDP Windowsでメッセージを受け取る方法は?
- 20. サーバからのメッセージを受け取るnetio nio java
- 21. Apache Kafka:カフカから最新のメッセージを受け取るには?
- 22. 違反からのコマンドでメッセージを受け取る
- 23. フェニックスコントローラからチャンネルにメッセージをブロードキャストする方法は?
- 24. PythonからC structを受け取る/取得する方法
- 25. GOからサーバーから値を受け取る方法は?
- 26. 購読チャンネルの変更時にYouTubeからGCM通知を受け取る方法
- 27. バルク挿入が完了したら「完了」メッセージを受け取る方法は?
- 28. PHPツールキット/ EasycomからiSeriesメッセージを受け取る
- 29. 別のプロセスからメッセージを受け取ります
- 30. Androidの別のサーバーから通知を受け取る方法
' - > skip'は必要ないことに注意してください。 – GoZoner
チャンネル数がnの場合はどうすればよいですか?開始時に定義された値があることを意味し、誰かが値を変更する可能性があります...?このようにしてコードを修正する必要があります。別の方法がありますか? –