Seminární skupina PB173 Tématicky zaměřený vývoj aplikací v jazyce C/C++
Cvičenie 3: Vlákna
Teoretická časť:
- funkcia vstupného bodu vlákna
- vytvorenie a ukončenie vlákna
- pozastavenie a obnovenie vlákna
- synchronizácia vlákien v užívateľskom režime (kritická sekcia)
- synchronizácia vlákien pomocou objektov jadra (udalosti, časovače, semafóry, mutexy)
Podporný učebný text:
Slidy k semináru:
Domáca úloha č.3: (termín odovzdania: 20.10.2010 vč.)
2 body
Vytvorte konzovolú aplikáciu. Program začne vytvorením 4 dispatcher objektov (fcie CreateEvent
a FindFirstChangeNotification
):
- change notification object -
NOTIFICATION_OBJECT
(je signalizovaný systémom v okamihu nejakej zmeny vo Vami zadanom adresári (odporúčam prázdny adresár)) - event object -
DONE_EVENT
- event object -
ERROR_EVENT_1
- event object -
ERROR_EVENT_2
Následne vytvorí 2 vlákna:
- vlákno načíta súbor poem.txt a podľa zadania z úlohy č.1, upraví báseň a v už upravenej forme ju zapíše do súboru out.txt (tento súbor vytvorte v adresári použitom pri vytvorení
NOTIFICATION_OBJECT
). Funkcia vlákna sa týmto ukončí. Ak počas behu vlákna dôjde k akejkolvek chybe, signalizujeERROR_EVENT_1
(fciaSetEvent
) a skončí. - vlákno zistí detaily aktuálneho procesu, následne signalizuje
DONE_EVENT
a skončí. Pokiaľ došlo k nejakej chybe, signalizujeERROR_EVENT_2
a skončí.
Po vytvorení vlákien primárne vlákno vstúpi do cyklu, ktorý bude bežať kým beží aspoň jedno z vytvorených vlákien. Tu volá funkciu WaitForMultipleObjectEx
a čaká na signalizovanie niektorého z objektov (timeout 5000ms). V jednotlivých prípadoch sa chová nasledovne:
NOTIFICATION_OBJECT
- na konzolu vypíše upozornenie, že prvé vlákno spracovalo báseň a uvedie cestu k súboru out.txtDONE_EVENT
- na konzolu vypíše údaje o aktuálnom proceseERROR_EVENT_1
- na konzolu vypíše, že došlo k chybe vo vlákne č. 1ERROR_EVENT_2
- na konzolu vypíše, že došlo k chybe vo vlákne č. 2- timeout - pokračuje v cykle
Ak sa obidve vlákna ukočili, končí aj celý program.
V celom programe dôsledne dbajte na spracovanie chýb! Ak v programe nedôjde k žiadnej chybe, návratová hodnota je 0, inak lastError
.