mtype { NOONE, ONE, TWO, THREE }; /* Symbols, used as fork-owner values. */ /* Global shared values */ mtype fork_holder[3] = NOONE; active proctype philosopher1() { int left_fork = 0; int right_fork = 1; do :: /* Grab left fork. */ fork_holder[ left_fork] == NOONE -> fork_holder[ left_fork] = ONE; /* Grab right fork. */ fork_holder[right_fork] == NOONE -> fork_holder[right_fork] = ONE; printf("Philosopher 1 eating.\n"); /* Drop forks. */ fork_holder[ left_fork] = NOONE; fork_holder[right_fork] = NOONE; od } active proctype philosopher2() { int left_fork = 1; int right_fork = 2; do :: /* Grab left fork. */ fork_holder[ left_fork] == NOONE -> fork_holder[ left_fork] = TWO; /* Grab right fork. */ fork_holder[right_fork] == NOONE -> fork_holder[right_fork] = TWO; printf("Philosopher 2 eating.\n"); /* Drop forks. */ fork_holder[ left_fork] = NOONE; fork_holder[right_fork] = NOONE; od } active proctype philosopher3() { int left_fork = 2; int right_fork = 0; do :: /* Grab left fork. */ fork_holder[ left_fork] == NOONE -> fork_holder[ left_fork] = THREE; /* Grab right fork. */ fork_holder[right_fork] == NOONE -> fork_holder[right_fork] = THREE; printf("Philosopher 3 eating.\n"); /* Drop forks. */ fork_holder[ left_fork] = NOONE; fork_holder[right_fork] = NOONE; od }