This shows you the differences between two versions of the page.
so:laboratoare:laborator-09 [2021/05/02 17:37] teodor_stefan.dutu [Registered Wait Functions] |
so:laboratoare:laborator-09 [2022/05/06 13:38] (current) costin.carabas [Exercițiul 6 - Barrier] |
||
---|---|---|---|
Line 846: | Line 846: | ||
Funcția ''UnregisterWaitEx'' va semnaliza //event//-ul ''CompletionEvent'' în cazul în care se termină cu succes și rutina de //callback// s-a terminat cu succes. Dacă valoarea lui ''CompletionEvent'' nu este ''NULL'', atunci funcția va aștepta finalizarea operației de așteptare și terminarea rutinei asociate. | Funcția ''UnregisterWaitEx'' va semnaliza //event//-ul ''CompletionEvent'' în cazul în care se termină cu succes și rutina de //callback// s-a terminat cu succes. Dacă valoarea lui ''CompletionEvent'' nu este ''NULL'', atunci funcția va aștepta finalizarea operației de așteptare și terminarea rutinei asociate. | ||
</spoiler> | </spoiler> | ||
- | ====== Exerciții de laborator ====== | + | ====== Sumar ====== |
+ | ^ Operație ^ POSIX ^ Windows ^ | ||
+ | | Crearea unui fir de execuție | ''pthread_create'' | [[#crearea_firelor_de_executie|CreateThread]] | | ||
+ | | Așteptarea unui fir de execuție | ''pthread_join'' | [[#asteptarea_firelor_de_executie|WaitForSingleObject]] | | ||
+ | | Crearea unui mutex | ''pthread_mutex_init'' | [[#crearea_si_deschiderea|CreateMutex]] | | ||
+ | | Obținerea unui mutex | ''pthread_mutex_lock'' | [[#obtinerea|WaitForSingleObject]] | | ||
+ | | Cedarea unui mutex | ''pthread_mutex_unlock'' | [[#cedarea|ReleaseMutex]] | | ||
+ | | Distrugerea unui mutex | ''pthread_mutex_destroy'' | [[#distrugerea|CloseHandle]] | | ||
+ | | Crearea unui semafor | ''sem_init''/''sem_open'' | [[#crearea_si_deschiderea1|CreateSemaphore]] | | ||
+ | | Decrementarea unui semafor | ''sem_wait'' | [[#decrementarea_asteptarea|WaitForSingleObject]] | | ||
+ | | Incrementarea unui semafor | ''sem_post'' | [[#incrementarea|ReleaseSemaphore]] | | ||
+ | | Distrugerea unui semafor | ''sem_destroy''/''sem_close'' | [[#distrugerea1|CloseHandle]] | | ||
+ | | Thread Local Storage | [[https://gcc.gnu.org/onlinedocs/gcc/Thread-Local.html|__thread]], [[https://linux.die.net/man/3/pthread_key_create|pthread_key_create]], [[https://linux.die.net/man/3/pthread_setspecific|pthread_setspecific]], [[https://linux.die.net/man/3/pthread_getspecific|pthread_getspecific]], [[https://linux.die.net/man/3/pthread_key_delete|pthread_key_delete]] | [[#thread_local_storage|TlsAlloc, TlsSetValue, TlsGetValue, TlsFree]] | | ||
- | ===== Windows ===== | + | ====== Exerciții ====== |
<note important> | <note important> | ||
Line 863: | Line 875: | ||
Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://gitimmersion.com. | Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://gitimmersion.com. | ||
</note> | </note> | ||
+ | |||
+ | ===== Windows ===== | ||
<note tip> Pentru a deschide proiectul Visual Studio conținând exercițiile, deschideți fișierul lab09.sln. </note> | <note tip> Pentru a deschide proiectul Visual Studio conținând exercițiile, deschideți fișierul lab09.sln. </note> | ||
Line 890: | Line 904: | ||
În cadrul acestui exercițiu dorim să testăm diverse tipuri de incrementări atomice ale unei variabile, comparându-le timpul de execuție. Deschideți sursa ''interlocked.c'' din proiectul ''3-interlocked''. Programul crează ''NO_THREADS'' fire de execuție, care incrementează circular o variabilă (când se ajunge la o limită se resetează la 0). | În cadrul acestui exercițiu dorim să testăm diverse tipuri de incrementări atomice ale unei variabile, comparându-le timpul de execuție. Deschideți sursa ''interlocked.c'' din proiectul ''3-interlocked''. Programul crează ''NO_THREADS'' fire de execuție, care incrementează circular o variabilă (când se ajunge la o limită se resetează la 0). | ||
- | Asigurați accesul exclusiv la variabila incrementată folosind [[#operatii atomice cu variabile partajate interlocked variable access | Interlocked Variables]] deoarece mecanismul e mai rapid decât o incrementare normală protejată cu ''Mutex'' sau ''CRITICAL_SECTION'' (folosiți funcția ''InterlockedCompareExchange''). Incrementarea circulară se va face în funcția ''thread_function'' (urmăriți comentariile cu // TODO 1 //). Veți avea nevoie de două operații interlocked (''InterlockedIncrement'' și ''InterlockedCompareExchange''). | + | Asigurați accesul exclusiv la variabila incrementată folosind [[#operatii atomice cu variabile partajate interlocked variable access | Interlocked Variables]] deoarece mecanismul e mai rapid decât o incrementare normală protejată cu ''Mutex'' sau ''CRITICAL_SECTION'' (folosiți funcția ''InterlockedCompareExchange''). Incrementarea circulară se va face în funcția ''thread_function'' (urmăriți comentariile cu //TODO 1//). Veți avea nevoie de două operații interlocked (''InterlockedIncrement'' și ''InterlockedCompareExchange''). |
Identificați o problemă cu folosirea ''Interlocked Operations'' pentru a incrementa circular o variabilă. | Identificați o problemă cu folosirea ''Interlocked Operations'' pentru a incrementa circular o variabilă. | ||
Line 918: | Line 932: | ||
typedef struct { | typedef struct { | ||
HANDLE hGuard; /* mutex to protect internal variable access */ | HANDLE hGuard; /* mutex to protect internal variable access */ | ||
- | HANDLE hEvent; /* auto-resetable event */ | + | HANDLE hEvent; /* manual resetable event */ |
DWORD dwCount; /* number of threads to have reached the barrier */ | DWORD dwCount; /* number of threads to have reached the barrier */ | ||
DWORD dwThreshold; /* barrier limit */ | DWORD dwThreshold; /* barrier limit */ | ||
Line 960: | Line 974: | ||
* Implementați vizualizarea unui timer; spre exemplu, un fir de execuție care alternează două operații: draw și sleep. (desenează, se oprește, desenează, iar se oprește și tot așa; intervalul unei operații poate fi același) | * Implementați vizualizarea unui timer; spre exemplu, un fir de execuție care alternează două operații: draw și sleep. (desenează, se oprește, desenează, iar se oprește și tot așa; intervalul unei operații poate fi același) | ||
*/ | */ | ||
- | ===== Soluții ===== | ||
- | |||
- | [[http://elf.cs.pub.ro/so/res/laboratoare/lab09-sol.zip | Soluţii laborator 9]] | ||
- | ~~NOCACHE~~ |