Szál

A Programozás Wiki wikiből

A szál (angolul thread) az operációs rendszerek szintjén definiált legkisebb független végrehajtási egység. A többszálú végrehajtási környezetekben egyszerre több szál is létezhet és működhet párhuzamosan (vagy kvázi-párhuzamosan), akár egyetlen folyamaton (programon) belül is.

A mai, modern operációs rendszerek több szálat is képesek kezelni és futtatni az ütemező segítségével, ellentétben a régebbiekkel, amelyek egyetlen szálban hajtottak végre mindent. Ezek esetében az egyetlen aktív feldolgozási szál rendelkezett a számítógép összes erőforrása felett és mindaddig nem lehetett más feldolgozást elindítani, amíg ez a szál (ami egyben a program is volt) le nem állt.

A többszálú programozás lényege az, hogy az elvégzendő feladathalmazt több, egymástól függetlenül végrehajtásra kerülő kisebb részre (szálra) bontsunk fel úgy, hogy ezen programrészek párhuzamosan (elvileg egyidőben) futhassanak. Ez az egymástól nem, vagy csak lazán függő feldolgozási folyamatok esetében, a program végrehajtási idejének csökkentését teszi lehetővé.

Az egyetlen fizikai feldolgozó egységgel rendelkező gépeken, a többszálúság az időmegosztásos elven alapszik, vagyis az operációs rendszer minden elindított szálnak ad egy előre meghatározott - a másodperc törtrészét képező - időtartamot a futásra, majd ha az letelt, a szál feladja a fennmaradó időt, vagy olyan kéréssel fordul hozzá, amely csak másik szál futásával teljesíthető, akkor a rendszer egy más szálnak adja át a vezérlést. Az egyes szálaknak kiosztott idő hossza jellemzően fix, de az adott szál fontossága (prioritása) befolyásolja azt, hogy milyen gyakran kap ilyen időszeletet, és ezzel futási lehetőséget. Még az egy időben egyetlen szálat futtatni képes processzorok esetén is előnyös lehet a szálak használata, mivel ha a szálon olyan kód fut, amelyiknél blokkolódik a kód végrehajtás (pl. filekezelés, I/O műveletek, hálózati kérésválaszára várakozás stb), akkor az operációs rendszer ütemezője elveszi a száltól a még hátralevő időkeretét és átadja a vezérlést egy másik szálnak.

Programozói szemszögből nézve egy szál implementációja operációs rendszerenként különbözik, viszont mindegyik jól dokumentált és nem kellene gondot okozzon annak megírása.


Példa[szerkesztés]

Íme egy Windows operációs rendszeren futtatható, C nyelven írt egyszerű, többszálú program forráskódja:

#include <windows.h>
#include <stdio.h>

/* a szál kódjának belépési pontja */
unsigned long __stdcall ThreadFunc( void *pParam )
{
    /* szöveg kiíratása a konzolra */
    printf( "Hello vilag a szalbol" );

    /* a szál kilépési pontja; ezen utasítás után a szál befejeződik */
    return 0;
}

/* a program belépési pontja */
int main( int argc, char *argv[] )
{
    /* a szálkezelő deklarációja ( handle ) */
    HANDLE hThread;

    /* szál elindítása alapértelmezett értékekkel */
    hThread = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, NULL, 0, NULL );

    /* várakozás a szál befejezésére */
    WaitForSingleObject( hThread, INFINITE );

    /* a szál részére lefoglalt erőforrások felszabadítása */
    CloseHandle( hThread );

    /* program kilépési pontja */
    return 0;
}