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:

  1. 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, signalizuje ERROR_EVENT_1 (fcia SetEvent) a skončí.
  2. vlákno zistí detaily aktuálneho procesu, následne signalizuje DONE_EVENT a skončí. Pokiaľ došlo k nejakej chybe, signalizuje ERROR_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.txt
  • DONE_EVENT - na konzolu vypíše údaje o aktuálnom procese
  • ERROR_EVENT_1 - na konzolu vypíše, že došlo k chybe vo vlákne č. 1
  • ERROR_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.