--- /dev/null
+/* Peterson's algorithm for N processes - see Lynch's book, p. 284 */
+
+#ifndef N
+ #define N 3 /* nr of processes */
+#endif
+
+byte turn[N], flag[N];
+
+byte ncrit; /* auxiliary var to check mutual exclusion */
+
+active [N] proctype user()
+{ byte j, k;
+ /* without never claims, _pid's are: 0 .. N-1 */
+again:
+ k = 0; /* count max N-1 rounds of competition */
+ do
+ :: k < N-1 ->
+ flag[_pid] = k;
+ turn[k] = _pid;
+
+ j = 0; /* for all j != _pid */
+ do
+ :: j == _pid ->
+ j++
+ :: j != _pid ->
+ if
+ :: j < N ->
+ (flag[j] < k || turn[k] != _pid);
+ j++
+ :: j >= N ->
+ break
+ fi
+ od;
+ k++
+ :: else -> /* survived all N-1 rounds */
+ break
+ od;
+
+ ncrit++;
+ assert(ncrit == 1); /* critical section */
+ ncrit--;
+
+ flag[_pid] = 0;
+ goto again
+}