lab 1, 2, 3 (pthreads) Flashcards
Diferenta proces - thread
un proces e o instanta de rulare a unui program (2 procese diferite NU NU NU partajeaza spatiul de adrese)
thread-ul e o unitate de lucru a unui proces ( un crafting table al procesului ) si mai multe thread-uri pot partaja resurse
Trasaturi programe care beneficiaza de implementari multi-threading
contin componente computationale care pot fi executate in paralel
au date pe care se poate opera in paralel ( un vector )
se blocheaza ocazional asteptand I/O
trebuie sa raspunda la evenimente asincrone
anumite componente de executie au o prioritate mai mare
Cum e cu thread-urile la inceput, inainte sa creezi un thread cu pthread_create() ? Dar la sfarsit?
La inceput e un singur thread ( main thread ) si de pe thread-ul asta se apeleaza pthread_create() si se fac threaduri noi. La sfarsit tMain se opreste si el.
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void (start_routine) (void *), void *arg);
*thread = un id pt threadul tocmai creat, folosit pt a opri / referi thread-ul
attr = setezi diferite atribute pt thread, de obicei il lasam pe NULL
start_routine = pointer la functia care e executata pe threadul nou creat
arg = singurul parametrul al functiei start_routin
Care e nr maxim de thread-uri pe care il poti crea?
Depinde de implementarea pthreads pe care o ai in program, dar nu se recomanda sa ai mai multe thread0uri decat core-uri pe masina, pt ca dupa apare foarte mult overhead.
Cum rezolvi problema ca poti sa primesti un singur parametru in functia executata pe thread?
Argumentul primit e de tip void*, deci poti sa ti faci o structura cu ce variabile vrei tu, si o dai pe aia ca variabila.
cum se reunesc thread-urile?
pthread_join. Prin apelul functiei, threadul care apeleaza il asteapta pe cel apelat, pana cand acessta isi termina functia de thread.
pthread_join(pthread_t thread, void** retval) ?
thread = threadul PE care il asteptam
retval = valoarea de retur a thread ului asteptat, poate fi si NULL daca nu ne intereseaza
daca threadul termina inainte de pthread_join?
nu i problema, atunci functia va returna instant
ce e mutex?
o primitiva de sincronizare prin care protejam accesul la date atunci cand e posibil sa avem scrieri concurente
are 2 operatii principale : lock si unlock
cand intra un thread in mutex, isi ia lock, pana cand iese, si apoi e unlocked
Ce e o zona critica?
o zona critica e acolo unde se poate afla un singur thread in acelasi timp, practic o cabina de proba, unde are voie doar unul pe rand.
daca t1 incearca sa intre in zona critica “peste” t0, atunci t1 asteapta pana cand t0 temrina
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
mutex = referinta la variabila mutex
attr = atributele mutexului nou creat
Secventa tipica de folosire a unui mutex?
se creaza si se initializeaza un mutex
mai multe thread-uri incearca sa inchida mutexul
doar unul reuseste si ajunge sa “detina” mutexul
threadul realizeaza operatiile pe datele “protejate”
threadul deschide mutexul iesind din zona critica
acum alt thread poate sa intre in zona critica
la final distrugem mutexul
ce operatii putem face cu mutexul?
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
Cand produce mutexul comportament nedeterminist?
Cand un thread care nu detine mutexul incearca sa dea unlock pe un mutex pe care nu il detine.