2016-05-04 21:39 GMT+03:00 Andreea D. via so <[email protected]>: > 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 _______________________________________________ http://ocw.cs.pub.ro/courses/so/info/lista-discutii
