Problem pripravljača sendviča temelji se na "problemu pušača cigareta" koji je prvi opisao Suhas Patil 1971 kako bi istaknuo problem sinkronizacije korištenjem semafora.
U neku trgovinu ulaze kupci koje
si žele napraviti sendvič. Za napraviti sendvič te osobe trebaju kruh, šunku i
sir. Svaka osoba već ima jedan sastojak i trebaju joj iduća dva. Trgovac u
trgovini ima sva tri sastojka u velikoj količini. Trgovac nasumice odabire dva
različita sastojka i stavlja ih na stol. Kupac koji je u trgovini i koji ima
različit sastojak od onih na stolu, uzima sastojke sa stola, izlazi iz trgovine,
slaže si sendvič i jede. U trgovini u svakom trenutku može biti najviše tri
kupca i to s različitim sastojcima. Tek kad neki kupac izađe, u trgovinu može
ući drugi, ali samo takav koji treba isti sastojak kao i ovaj koji izlazi.
Sustav se sastoji od jedne dretve/procesa trgovca i dretvi/procesa kupaca koji
se dinamički stvaraju (npr. svake sekunde po jedan kupac). Zadatak je ispravno sinkronizirati
procese/dretve trgovca i kupce.
proces/dretva Trgovac() {
ponavljaj {
...
(s1, s2) = nasumično_odaberi_dva_različita_sastojka
stavi_sastojke_na_stol(s1, s2)
...
} do ZAUVIJEK
}
proces/dretva Kupac(p) {
(r1, r2) = sastojci_koji_pripravljaču_nedostaju(p)
...
ako (na_stolu_su_mi_potrebni_sastojci(r1, r2) == DA) {
uzmi_sastojke(r1, r2)
...
sastavi_i_pojedi_sendvič()
...
}
}
# ./a.out Kupac Sendviča 1: ima kruh Kupac Sendviča 2: ima sir Kupac Sendviča 3: ima šunku Trgovac stavlja: kruh i sir Kupac Sendviča 3: uzima sastojke, izlazi iz trgovine, slaže si sendvič i jede Trgovac stavlja: šunku i sir Kupac Sendviča 1: uzima sastojke, izlazi iz trgovine, slaže si sendvič i jede ^C #