Если вы хотите, чтобы число ваших каналов было переменным без необходимости изменения реализации отправляющей и получающей частей, вы можете использовать подход следующего примера производителя-потребителя:
#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
, но это не имеет никакого значения при проверке модели, где исследуется любой возможный путь.