Tl:dr Sì si può.
Pseudo-codice
//produttore (j)
flag[j] = true;
turno = i;
while (flag == true && turno == i) ; //busy waiting: se il produttore vuole consumare un oggetto ed è il suo turno aspetto
foo_producer(); // codice eseguito dal produttore
flag[j] = false; //adesso il produttore è fuori dalla zona critica
//------
//consumatore (i)
flag = true;
turno = j;
while (flag[j] == true && turno == j) ;
foo_consumer();
flag = false;
L'algoritmo di peterson viene usato per sincronizzare due processi. Utilizza due variabile, un array di booleani di lunghezza 2 (2 celle) e una variabile int turno.
Nella soluzione i rappresenta il consumatore e j rappresenta il produttore (come da commenti).
Inizialmente i flag sono settati a false, quando un processo vuole eseguire una zona critica imposta il suo flag a true e turno nell'indice dell'altro processo. Questo significa che il processo vuole eseguire ma permette all'altro di essere eseguito prima. Il processo esegue una busy waiting fintantoché l'altro processo non ha terminato.
Dopo aver eseguito la sezione critica, imposta il suo flag a falso indicando che ha terminato le sue operazioni.