Wątek przeniesiony 2021-11-19 12:09 z C/C++ przez Adam Boduch.

Bariera, Programowanie wspóbieżne

0

Witam. Mam oto takie zadanie:
Zapisać w pseudokodzie implementacje bariery przy pomocy monitora. Monitor
powinien implementować metodę czeka. Wywołanie metody czeka powinno zatrzymać (stan
wstrzymany) wątek dopóki pewna liczba wątków, zdefiniowana jako poziom bariery nie
wywoła tej metody. Wtedy wszystkie wątki powinny zostać automatycznie zwolnione (stan
gotowy do wykonania).
Chciałbym zasięgnąć porady czy napisany przeze mnie kod ma sens

BARIERA
  semaphore bar[N]
  int ile=0
  condition c

  int i=1
    while (i<N)
       bar[i]=0
       i=i+1

  operation czeka
    ile=ile+1
    if (ile!=N)
       waitc(c)

     int j=1
     while (j<N)
         signal(bar[j])
         j=j+1
     ile=0
     signalc(c)
0

Ok, ale czemu ten pseudo kod dałeś do działu C oraz otagowałeś jako C? C to nawet zabardxo nie przypomina

0

Trudno jest cokolwiek powiedzieć o sensie - gdyż ten pseudokod jest tak czytelny jak wróżba z tarota. Spróbuj użyć kodu przypominającego bardziej język C , C++ - dodaj nawiasy klamrowe, średniki.

0

Czy monitor to coś w stylu condition variable czy po prostu liczący semafor?
OK, @stivens dzięki ;)

1

Napisałem komentarze. Tldr - kod ma niezbyt wielki sens.

BARIERA
  semaphore bar[N]              // nigdy nie robisz wait na żadnym z bar - ta tablica jest zbędna zupełnie
  int ile=0
  condition c

  int i=1                                // off by one - albo i=0, albo while (i<=N)
    while (i<N)
       bar[i]=0
       i=i+1

  operation czeka
    ile=ile+1
    if (ile!=N)
       waitc(c)

     int j=1
     while (j<N)                // off-by-one, tak jak wyżej
         signal(bar[j])         // po co to w ogóle?
         j=j+1
     ile=0
     signalc(c)                  // jak wywołasz signalc, to oddajesz sterowanie wątkom które zrobiły waitc, z których każdy wykona tę pętlę i signala pod koniec - zupełnie bez sensu

1 użytkowników online, w tym zalogowanych: 0, gości: 1