Semaphore: admin=1; board=0; car=0; unboard=0. Counters: nr=0; nrw=0; PASSENGER: P (admin); if (nr==C) {nrw++; V(admin);P(board);} //Now I need to board nr++; if (nr==C) { V (car); V (admin); } else if (nrw > 0) { nrw--; V (board); //I'm passing the baton to the next boarder. That guy is now in charge of the admin semaphore } else { V (admin); } P (unboard); nr--; if (nr > 0) V (unboard); //passing the baton else if (nrw > 0) {nrw--; V (board);} //passing the baton to the boarders else V (admin); CAR while (true) { P (car); drive around P (admin); V (unboard); //passing the baton }