Niti (sprotna naloga)
V sklopu te naloge demonstrirajte uporabo knjižnice pthread za niti. Pripravite 3 programe, ki izvedejo v nadaljevanju opisane naloge. Pripravite tudi Makefile, ki bo vašo kodo prevedel v izvedljive programe.
Posamezni naslov podnaloge v nadaljevanu so sestavljeni iz pričakovanega imena programa in pričakovanega imena izvorne zbirke.
Na sistem oddajte .zip paket z Makefile skripto in izvornimi zbirkami. Bodite pozorni na poimenovanja. Pred oddajo preverite delovanje z avtomatskim preizkusom. naloga_1 (naloga_1.c)
Vaš program bo prejel parametre preko ukazne vrstice v obliki:
$ ./naloga_1 ...
Milisekunde so vedno cela števila.
Za vsak par argumentov milisekunde in sporočilo naj program ustvari novo nit. Nit naj najprej počaka podano število milisekund nato pa izpiše svojo zaporedno število in sporočilo. Glavna nit mora seveda počakati vse ustvarjene niti. Niti bo največ 10.
Primer zagona in izpisa:
$ ./naloga_1 300 konec 100 zacetek 200 jedro nit 2: zacetek nit 3: jedro nit 1: konec
naloga_2 (naloga_2.c)
Vaš program bo prejel poti do 3 zbirk (pravzaprav bodo to imenovane cevi). Te zbirke odprite samo za branje. Za vsako pot ustvarite svojo nit, ki bo iz podanega vira prebrala 10 znakov dolgo sporočilo. Vsaka nit naj izpiše prebrano sporočilo skupaj s svojim zaporednim številom. Sporočilo naj vrne glavni niti.
Glavna nit naj po zaključku vseh ustvarjenih niti izpiše vsa tri sporočila kot eno sporočilo.
Primer zagona in izpisa:
$ ./naloga_2 ./zbirka_1 ./zbira_2 ./zbirka_3 nit 3: ih_______ nit 1: sporocilo_ nit 2: v_treh_kos
glavna nit: sporocilo_v_treh_kosih_______
naloga_3 (naloga_3.c)
Implementiranje program, ki pospeši seštevanje vrednosti s pomočjo niti. Kot parametri ukazne vrstice bo programu podano število vrednosti, pot do zbirke s podatki in število niti, ki jih želimo uporabiti za seštevanje.
Za odpiranje uporabite funkcijo fopen, ali pa kombinacijo open in fdopen. Nato lahko podatke preberete s funkcijo fscanf, po vzoru:
int val; fscanf(in_file_obj, "%d", &val);
ki prebere eno vrednost in jo hrani v spremenljivko val. V zbirki bo vsaj toliko vrednosti, kot jih potrebujete, morda več. Vrednosti preberete v dovolj veliko tabelo.
Nato naj glavna nit ustvari podano število niti, vsaka nit pa naj sešteje svoj del tabele. Glavna nit mora ustvariti vse niti preden začne čakati na njihove rezultate.
Problem seštevanja rešite s prepletanjem. Za N niti, prva nit sešteva vrednost 0, N, 2N, ... druga nit 1, N+1, 2N+1, ... in tako dalje (vsaka nit začne na svojem mestu tabele, nato pa skačejo po N mest).
Vsaka nit naj izpiše svoj delni seštevek, glavna nit pa naj nato rezultate posameznih niti sešteje in izpiše celotno vsoto.
Primer zagona in izpisa (prebere 11 števil iz zbirke podatki.txt in jih sešteje s 3-mi nitmi):
$ ./naloga_3 11 ./podatki.txt 3 nit 1: 7 nit 3: 5 nit 2: 0 vsota: 12
Vsebina testne zbirke podatki.txt:
1 -3 7 0 2 -1 4 5 -1 2 -4 1 -3 5 12 8