6. feladat

Feladva nov. 23-28, 2009

Határidő dec. 12, 2009

POSIX-Solaris szálak (threads) - szinkronizálás nélkül

 

 Feltöltendő állomány neve: S06_nn_xxxxxxx(_aa).c, ahol nn - feladat száma; xxxxxxx - felhasználó azonosítója a linux szerveren; (aa - az illető állomány funkcionalitásának valamilyen ismertető jegye több modul használata esetén)

 

1. Implementáljuk a termelő/fogyasztó problémáját szálakkal (a termelő, illetve fogyasztó véges körkörös pufferbe ír). Hozzunk létre több termelő, illetve fogyasztó szálat.

2. Írjunk szerver programot, melyhez több kliens kapcsolódhat. A szerver minden egyes kérés kezelésére létrehoz egy külön szálat, az pedig kiírja az érkező üzeneteket az alábbi alakban:

kliens x: üzenet, ahol x egy szám, mely a szerverhez való kapcsolódás sorrendjét tükrözi.

3. Írjunk programot, mely N szálat hoz létre. Ezek mindenike kiír egy üzenetet, az azonosítóját, és megpróbálja végrehajtani a paraméterként kapott shell-parancsot, melynek kimenetét a “<nr>_out” (nr=1,..,N) állományba írja. A művelet befejezése után is írjon ki egy-egy üzenetet minden szál.

4. Egy program létrehoz egy 1 és 0 elemeket tartalmazó mátrixot. Egy-egy szál n másodpercenként, soronként végigjárja a mátrixot, és amennyiben valamelyik mátrixelem szomszédságában több, mint 5 1-es érték van, akkor ennek az elemnek az értéke is 1 lesz, ha pedig több, mint 5 0-s szomszédja van, 0-vá válik ő is. Kiírjuk a mátrixot mindaddig, ameddig már nem változik többé.

5. Egy program létrehoz egy 1 és 0 elemeket tartalmazó mátrixot. Egy-egy szál n másodpercenként, soronként végigjárja a mátrixot, és amennyiben valamelyik mátrixelem szomszédságában több, mint 5 0-s érték van, akkor ennek az elemnek az értéke 1 lesz, ha pedig több, mint 5 1-es szomszédja van, 0-vá válik. Kiírjuk a mátrixot mindaddig, ameddig már nem változik többé.

6. Írjunk programot, mely egy NxN-es mátrixot generál, majd létrehoz N szálat. Ezt követően időnként  generál egy i, illetve j indexet, és véletlenszerűen módosítja a mátrix i,j elemét, majd hozzáírja a módisított mátrixot egy állományhoz. Az i. szál időnként kiszámolja külön az i. sorban, illetve i. oszlopban levő elemek összegét, és csak akkor írja azt ki, ha valami módosult az előzőekhez képest.  


Tippek / gyakori hibák

  • Számolni kell azzal, hogy a folyamat globális változóihoz minden egyes szál hozzáfér, ellentétben a fork-al létrehozott gyerekfolyamatok esetével. Ha tehát az egyik szál módosít egy értéket, az összes többi látja a módosítást.
    • ha pl. ciklusban hozunk létre egymás után több szálat, és a szálnak különböző értékeket szeretnénk megadni paraméterként, akkor használjunk erre tömböt, és a tömb megfelelő elemét adjuk át paraméterként, különben meglepetésként érhet, hogy pl. több szál ugyanazt az értéket írja ki, pedig mi úgy gondoljuk, hogy különbözőeket kéne.
  • Ha a szálak létrehozása után a főprogram befejeződik (anélkül, hogy megvárná a szálak befejeződését - pthread_join -), a szálak sem fognak tovább futni.
  • Adjunk lehetőséget arra, hogy a szálak párhuzamosan futhassanak (azaz semmiképpen NE azután hozzuk létre a következő szálat, miután az előzőt bevártuk)