Loops Promela(ispin)在循环结束时阻塞

Loops Promela(ispin)在循环结束时阻塞,loops,spin,promela,Loops,Spin,Promela,嗯,我有这个(它是代码的一部分): 20 proctype Main(字节myID){ 21做 22::int J=0; 23 int K=0; 24 25原子{ 26 requestCS[myID]=true; 27 myNum[myID]=最高myID[myID]+1; 28 } 29 30做 31::J 32如果 33::J!=myID->ch[J]!请求,myID,myNum[myID]; 34 fi; 35j++; 36::否则会中断; 外径37/////////////////

嗯,我有这个(它是代码的一部分):

20 proctype Main(字节myID){
21做
22::int J=0;
23 int K=0;
24
25原子{
26 requestCS[myID]=true;
27 myNum[myID]=最高myID[myID]+1;
28    }
29
30做
31::J
32如果
33::J!=myID->ch[J]!请求,myID,myNum[myID];
34 fi;
35j++;
36::否则会中断;
外径37//////////////////////////////////
38
39
40做
41:K
42 ch[myID]??答复;
43k++;
44::否则会中断;
外径45;
46
47
48 cs:临界++;
49断言(临界==1);
50临界--;
51 requestCS[myID]=false;
52
53字节N;
54做
55::empty(延迟[myID])->中断;
56延迟[myID]?N->ch[N]!回复,0,0;
外径57;
外径58;
59  }
例如,在////it stucks(写入超时)上,没有前进的路,就转到步骤40

这是Ricart Agrawala算法的一部分,这里是等人:

1   #define  NPROCS 2
2   int critical = 0;
3   byte myNum[NPROCS];
4   byte highestNum[NPROCS];
5   bool requestCS[NPROCS];
6   chan deferred[NPROCS] = [NPROCS] of {byte};
7   mtype={request, reply};
8   chan ch[NPROCS]=[NPROCS] of {mtype, byte, byte};
9   
10  init {  
11    atomic {
12      int i;
13      for (i : 0 .. NPROCS-1){
14        run Main(i);
15        run Receive(i);
16      }
17    }
18  }
19  
20  proctype Main(byte myID) {
21    do
22    ::int J=0;
23      int K=0;
24    
25      atomic{
26        requestCS[myID]=true;
27        myNum[myID]=highestNum[myID]+1;
28    }
29  
30      do
31      :: J <= NPROCS-1 ->
32        if
33          :: J != myID -> ch[J] ! request, myID, myNum[myID];
34        fi;
35        J++;
36      :: else break;
37      od;
38  
39    
40    do
41    :: K <= NPROCS-2 ->
42      ch[myID] ?? reply, _, _;
43      K++;
44    :: else break;
45    od;
46    
47    
48    cs: critical++;
49    assert (critical==1);
50    critical--;
51    requestCS[myID]=false;
52  
53    byte N;
54       do
55       :: empty(deferred[myID]) -> break;
56          deferred [myID] ? N -> ch[N] ! reply, 0, 0;
57       od;
58    od;
59  }
60  
61  proctype Receive(byte myID){
62    byte reqNum, source;
63    do
64     :: ch[myID] ?? request, source, reqNum;
65  
66       highestNum[myID] = ((reqNum > highestNum[myID]) -> reqNum : highestNum[myID]);
67  
68       atomic {
69        if
70        :: requestCS[myID] && ((myNum[myID] < reqNum) || ((myNum[myID] == reqNum) && (myID < source))) -> deferred[myID] ! source
71        :: else -> ch[source] ! reply, 0, 0;
72        fi;
73    }
74    od;
75  }
1#定义NPROC 2
2 int临界=0;
3字节myNum[NPROCS];
4字节最高数[NPROCS];
5个bool请求委员会[NPROC];
6{byte}的[NPROCS]=[NPROCS];
7 mtype={request,reply};
8{mtype,byte,byte}的chan ch[NPROCS]=[NPROCS];
9
10初始化{
11原子{
12 int i;
13(i:0..NPROCS-1){
14干管(一);
15运行接收(i);
16      }
17    }
18  }
19
20 proctype Main(字节myID){
21做
22::int J=0;
23 int K=0;
24
25原子{
26 requestCS[myID]=true;
27 myNum[myID]=最高myID[myID]+1;
28    }
29
30做
31::J
32如果
33::J!=myID->ch[J]!请求,myID,myNum[myID];
34 fi;
35j++;
36::否则会中断;
外径37;
38
39
40做
41:K
42 ch[myID]??答复;
43k++;
44::否则会中断;
外径45;
46
47
48 cs:临界++;
49断言(临界==1);
50临界--;
51 requestCS[myID]=false;
52
53字节N;
54做
55::empty(延迟[myID])->中断;
56延迟[myID]?N->ch[N]!回复,0,0;
外径57;
外径58;
59  }
60
61 proctype接收(字节myID){
62字节reqNum,源;
63做
64::ch[myID]??请求、源、请求数量;
65
66 highestNum[myID]=((reqNum>highestNum[myID])->reqNum:highestNum[myID]);
67
68原子{
69如果
70::requestCS[myID]&&((myNum[myID]延迟的[myID]!source
71::else->ch[source]!回复,0,0;
72 fi;
73    }
外径74;
75  }
我做错了什么? 先谢谢你


p.S.critical(关键)-是“模拟器”的关键部分,因为该算法适用于分布式系统…

出于以下几个原因,验证可能会停留在第37/40行。在此之前的代码是:

32        if
33          :: J != myID -> ch[J] ! request, myID, myNum[myID];
34        fi;
如果:
J==myID
或如果
ch[J]
已满且从不清空,则此
if
语句将永久阻止。您可以通过将
else
添加到
if
并小心处理“队列已满”情况来“修复”此问题。当然,“修复”可能与您试图建模的内容不一致

32        if
33          :: J != myID -> ch[J] ! request, myID, myNum[myID];
34        fi;