Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- największy numer który został obsłużony
- aktualny numer zlecenia
- user chcący enter lub switch zrobi to zanim do tego warsztatu enter 2*N innych userów
- którzy wykonali enter PO TYM, gdy on zawołał enter/switch
- mutex_numery_blokowane
- numery_blokowane = {} // MULTISET!!!
- daj_numer_entera_i_zablokuj_go(bool zwieksz) {
- // zwraca aktualny numer zlecenia enter
- // pozwól enterować tylko jeżeli nie ma zlecenia oczekującego
- exclusive mutex_numery_blokowane {
- x = thisworkshop->numer_entera
- if zwieksz {
- while najmniejszy_blokowany_numer + 2N < x + 1 {
- // zasnij i poczekaj az odblokowany zostanie jakis numer
- // po obudzeniu zrob ponownie:
- // TO JEST ZLE!!! TRZEBA KOLEJKOWAC ENTERY
- x = thisworkshop->numer_entera
- }
- thisworkshop->numer_entera++
- }
- numery_blokowane.add(x)
- return x
- }
- }
- odblokuj_numer_entera(int numer) {
- exclusive mutex_numery_blokowane {
- numery_blokowane.remove(numer)
- }
- }
- enter(dest) {
- numer_blokowanego_entera = daj_numer_entera_i_zablokuj_go(true)
- // rob co trzeba
- odblokuj_numer_entera(numer_blokowanego_entera)
- }
- switch(dest) {
- numer_blokowanego_entera = daj_numer_entera_i_zablokuj_go(false)
- // rob co trzeba
- odblokuj_numer_entera(numer_blokowanego_entera)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement