Systémové programovanie Windows Vlákna Andrea Číková Martin Osovský O čom to dnes bude? • Porovnanie proces vs. vlákno • Funkcia vstupného bodu vlákna • Vytvorenie a ukončenie vlákna • Synchronizácia vlákien Proces vs. vlákno Proces • Objekt jadra • Adresový priestor • Nečinný Vlákno • Objekt jadra • Zásobník vlákna • Vykonáva kód • Vytvorené v kontexte procesu Funkcia vstupného bodu vlákna • Primárne vlákno – (w)main alebo (w)WinMain • Ostatné vlákna: DWORD WINAPI ThreadFunc(PVOID param) { DWORD result = 0; ... return result; } Vytvorenie vlákna • Funkcia CreateThread: HANDLE CreateThread( PSECURITY_ATTRIBUTES threadAttr, DWORD stackSize, PTHREAD_START_ROUTINE startAddress, PVOID param, DWORD initFlags, PDWORD threadID); • Pri volaní funkcií C run-time knižnice použiť miesto CreateThread funkciu _beginthreadex Ukončenie vlákna • Funkcia vlákna skončí • ExitThread (_endthreadex) • TerminateThread • Proces obsahujúci vlákno skončí Ďalšie užitočné funkcie DWORD ResumeThread(HANDLE hThread); DWORD SuspendThread(HANDLE hThread); VOID Sleep(DWORD milliseconds); Synchronizácia vlákien • V užívateľskom režime: ▫ Interlocked* funkcie ▫ Kritické sekcie • Pomocou objektov jadra: ▫ Dispatcher object – akýkoľvek objekt jadra, na ktorý môžete čakať, typicky event, mutex, semaphore ▫ Funkcie WaitForSingleObject a WaitForMultipleObjects Wait* funkcie - detaily • WaitForSingleObject(): ▫ hObject špecifikuje objekt jadra ▫ milliseconds – čas v ms  0 – nečaká, skontroluje, či je objekt signalizovaný  INFINITE – čaká donekončena • WaitForMultipleObjects(): ▫ count <= MAXIMUM_WAIT_OBJECTS(64) ▫ objects – ukazateľ na pole objektov jadra ▫ waitAll – čakať na prvý zasignalizovaný objekt, alebo na všetky?  Funkcia vráti index prvého zasignalizovaného objektu • Vedľajšie efekty: ▫ Mutexy, auto-reset events a waitable timers sú po ukončení Wait* funkcií opäť nesignalizované Ďakujeme za pozornosť