#! /bin/bash N=2 function assegna(){ echo $2 >> $1 } function leggi(){ tail -1 $1 } for j in $(seq 1 $N); do echo "0">choosing$j echo "0">number$j done echo "1">alternanza function max(){ local m=$(leggi number1) for j in $(seq 1 $N); do m=$(( $m > $(leggi number$j) ? $m : $(leggi number$j) )) done echo $m } function p(){ local p for p in $(seq $(( $1 * 10 )) $(( $1 * 10 + 9 )) ); do while true; do # doorway assegna choosing$1 "1" assegna number$1 "$(( 1 + max ))" # bakery assegna choosing$1 "0" local j for j in $(seq 1 $N); do while [ $(leggi choosing$j) -ne 0 ]; do sleep 0.01 done while [ \( $(leggi number$j) -ne 0 \) -a \ \( \( $(leggi number$j) -lt $(leggi number$1) \) -o \ \( $(leggi number$j) -eq $(leggi number$1) \) -a \ \( $j -lt $1 \) \) ]; do sleep 0.01 done done # critical section if [ $(leggi alternanza) -eq $1 ]; then echo $p assegna alternanza "$(( ( $(leggi alternanza) % 2 ) + 1))" assegna number$1 "0" break else assegna number$1 "0" fi # non critical section done done } p 1 & p 2 & wait %1 %2