[so] [SO][Tema 4][Intrebari sincronizare]

Adrian Stanciu adrian.stanciu.pub at gmail.com
Wed May 4 22:33:36 EEST 2016


2016-05-04 21:39 GMT+03:00 Andreea D. via so <so at cursuri.cs.pub.ro>:
> Bună seara,

Bună, Andreea,

> Am încercat să folosesc metode de sincronizare pe threadurile mele astfel
> încât ele să apeleze handler-ul în ordinea în care au fost create și
> totodată să returneze id-ul thread-ului (return-ul din so_fork) înainte să
> apeleze start_thread.

Ideea e următoarea:
* în so_fork() trebuie să creezi un thread nou, real, ce va rula start_thread()
* start_thread(), rutina thread-ului, nu trebuie să apeleze handler-ul
imediat, ci trebuie să plaseze thread-ul respectiv în coada READY (iar
scheduler-ul îl va planifica la un moment ulterior de timp) - la asta
se referă exprimarea "asteaptă să fie planificat";
* de asemenea, trebuie să tratezi cazul special al primului thread
creat (de către so_fork-ul apelat din cadrul checker-ului); acel
thread va fi primul planificat de scheduler-ul tău
* când so_fork() s-a asigurat că thread-ul nou creat a fost pus în
coada READY sau direct în starea RUNNING (vezi cazul special al
primului thread din sistem) atunci se poate întoarce - la asta se
referă exprimarea "asteaptă ca threadul să intre în starea READY/RUN"

> Am întâmpinat două probleme:
>
> - varianta stabilă, ce ducea într-adevăr la apelarea handler-ului în ordinea
> creării thread-urilor, făcea ca funcția so_fork() să ajungă la return abia
> după ce se termina de executat funcția start_thread, lucru ce nu ar trebui
> să se întâmple
>
> - varianta instabilă, care nu asigură întotdeauna apelarea handler-ului în
> ordine, dă return înainte de start_thread dar cu toate acestea dacă aș salva
> într-o variabilă return-ul so_fork și as dori să mă folosesc de această
> variabilă în start_thread-ul so_fork-ului abia apela, variabila este goală
> (situația din test-ul 13)

Handler-ele nu trebuie să fie apelate în ordinea în care thread-urile
au fost create (asta să înțeleg că ai încercat să faci?). Scheduler-ul
decide ce thread rulează la un moment dat și pentru asta după fiecare
instrucțiune (fork/exec/wait/signal) trebuie interogat scheduler-ul
pentru a verifica dacă este necesară o preempție.

> Îmi este clar ca nu înțeleg cum trebuie făcută sincronizarea și modul în
> care trebuie apelate funcții și returnate valori. Situația cu care mă
> confrunt este asemănătoare cu exemplul făcut de Răzvan la curs, doar ca nu
> cred ca a fost urcat și acesta printre demo-uri ca să mă pot ajuta de el.
>
> Am adăugat și link-ul către repo-ul meu de git, în caz că este folositor.


Adrian


More information about the so mailing list