This shows you the differences between two versions of the page.
so:laboratoare:laborator-09 [2021/05/02 17:50] teodor_stefan.dutu [Sumar] |
so:laboratoare:laborator-09 [2022/05/06 13:38] (current) costin.carabas [Exercițiul 6 - Barrier] |
||
---|---|---|---|
Line 850: | Line 850: | ||
| Crearea unui fir de execuție | ''pthread_create'' | [[#crearea_firelor_de_executie|CreateThread]] | | | 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]] | | | Așteptarea unui fir de execuție | ''pthread_join'' | [[#asteptarea_firelor_de_executie|WaitForSingleObject]] | | ||
- | | Crearea unui mutex | ''pthread_mutex_init'' | [[#crearea|CreateMutex]] | | + | | Crearea unui mutex | ''pthread_mutex_init'' | [[#crearea_si_deschiderea|CreateMutex]] | |
| Obținerea unui mutex | ''pthread_mutex_lock'' | [[#obtinerea|WaitForSingleObject]] | | | Obținerea unui mutex | ''pthread_mutex_lock'' | [[#obtinerea|WaitForSingleObject]] | | ||
| Cedarea unui mutex | ''pthread_mutex_unlock'' | [[#cedarea|ReleaseMutex]] | | | Cedarea unui mutex | ''pthread_mutex_unlock'' | [[#cedarea|ReleaseMutex]] | | ||
| Distrugerea unui mutex | ''pthread_mutex_destroy'' | [[#distrugerea|CloseHandle]] | | | Distrugerea unui mutex | ''pthread_mutex_destroy'' | [[#distrugerea|CloseHandle]] | | ||
- | | Crearea unui semafor | ''sem_init''/''sem_open'' | [[#crearea1|CreateSemaphore]] | | + | | Crearea unui semafor | ''sem_init''/''sem_open'' | [[#crearea_si_deschiderea1|CreateSemaphore]] | |
- | | Decrementarea unui semafor | ''sem_wait'' | [[#decrementarea|WaitForSingleObject]] | | + | | Decrementarea unui semafor | ''sem_wait'' | [[#decrementarea_asteptarea|WaitForSingleObject]] | |
| Incrementarea unui semafor | ''sem_post'' | [[#incrementarea|ReleaseSemaphore]] | | | Incrementarea unui semafor | ''sem_post'' | [[#incrementarea|ReleaseSemaphore]] | | ||
| Distrugerea unui semafor | ''sem_destroy''/''sem_close'' | [[#distrugerea1|CloseHandle]] | | | Distrugerea unui semafor | ''sem_destroy''/''sem_close'' | [[#distrugerea1|CloseHandle]] | | ||
- | | Thread Local Storage | [[https://gcc.gnu.org/onlinedocs/gcc/Thread-Local.html|__thread]] | [[#thread_local_storage|TlsAlloc, TlsSetValue, TlsGetValue, TlsFree]] | | + | | 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]] | |
- | ====== Exerciții de laborator ====== | + | ====== Exerciții ====== |
- | + | ||
- | + | ||
- | ===== Windows ===== | + | |
<note important> | <note important> | ||
Line 878: | 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 905: | 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 933: | 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 975: | 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~~ |