Advertisement
Glenpl

Untitled

Nov 22nd, 2022
824
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. największy numer który został obsłużony
  2.  
  3. aktualny numer zlecenia
  4.  
  5.  
  6. user chcący enter lub switch zrobi to zanim do tego warsztatu enter 2*N innych userów
  7. którzy wykonali enter PO TYM, gdy on zawołał enter/switch
  8.  
  9.  
  10. mutex_numery_blokowane
  11. numery_blokowane = {}  // MULTISET!!!
  12.  
  13. daj_numer_entera_i_zablokuj_go(bool zwieksz) {
  14.   // zwraca aktualny numer zlecenia enter
  15.  
  16.   // pozwól enterować tylko jeżeli nie ma zlecenia oczekującego
  17.   exclusive mutex_numery_blokowane {
  18.     x = thisworkshop->numer_entera
  19.     if zwieksz {
  20.       while najmniejszy_blokowany_numer + 2N < x + 1 {
  21.         // zasnij i poczekaj az odblokowany zostanie jakis numer
  22.         // po obudzeniu zrob ponownie:
  23.         // TO JEST ZLE!!! TRZEBA KOLEJKOWAC ENTERY
  24.         x = thisworkshop->numer_entera
  25.       }
  26.       thisworkshop->numer_entera++
  27.     }
  28.     numery_blokowane.add(x)
  29.     return x
  30.   }
  31. }
  32.  
  33. odblokuj_numer_entera(int numer) {
  34.   exclusive mutex_numery_blokowane {
  35.       numery_blokowane.remove(numer)
  36.   }
  37. }
  38.  
  39.  
  40. enter(dest) {
  41.   numer_blokowanego_entera = daj_numer_entera_i_zablokuj_go(true)
  42.  
  43.   // rob co trzeba
  44.  
  45.   odblokuj_numer_entera(numer_blokowanego_entera)
  46. }
  47.  
  48. switch(dest) {
  49.   numer_blokowanego_entera = daj_numer_entera_i_zablokuj_go(false)
  50.  
  51.   // rob co trzeba
  52.  
  53.   odblokuj_numer_entera(numer_blokowanego_entera)
  54. }
  55.  
  56.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement