2. POSIX szálak

Szálak

  • A segítségükkel ki lehet használni a számítógépben rendelkezésre álló több processzormagot.

  • Az I/O-ra várakozás is hasznosan tölthető.

  • Gazdaságosabb, mint új processzt indítani.

  • A szálak egy közös névtéren osztoznak.

  • A szálak nem tartanak nyilvántartást arról, hogy milyen szálakat indítottak, azt nekünk kell megoldani.

A szálak egy processzen belül a következőket osztják meg egymással.

  • Memória címtér

  • Megnyitott fájlok (fájlleírók)

  • Szignálok kezelése

  • Az aktuális munkajegyzéket (cwd, pwd)

  • Felhasználó név és csoport (jogosultságok)

Minden szálban viszont egyediek az alábbiak:

  • Szál azonosító (Thread ID)

  • Regiszterek, verem mutató

  • Lokális változók, visszatérési címek

  • Prioritások

  • Visszatérési hibakódok

Szál létrehozása és indítása

int pthread_create(
  pthread_t* thread,
  const pthread_attr_t* attr,
  void *(*start_routine)(void *),
  void *arg);

Paraméterek:

  • thread: A szál azonosítója (unsigned long int típus)

  • attr: Szál beállításához szükséges attribútumok. (Alapértelmezéshez NULL érték.)

  • start_routine: A függvény, amelyet a szálban el kell indítani.

  • arg: Paraméterek, amelyek átadásra kerülnek a szálban indított függvénynek.

Visszatérési érték:

  • Amennyiben a szál sikeresen elindult, úgy 0 értékkel tér vissza, egyébként pedig hibakóddal.

Várakozás a szál végrehajtására

int pthread_join(
  pthread_t thread,
  void **retval);

Paraméterek:

  • thread: A szál azonosítója, amelyikre várni kell majd a főszálnak.

  • retval: A szál által visszaadott érték (pthread_exit hívásban). Amennyiben nincs rá szükség, úgy NULL-al jelölhető.

Visszatérési érték:

  • Sikeres végrehajtás esetén 0, egyébként hibakód.

Mutexek

Mutex: Mutual Exclusion

Inicializálás:

pthread_mutex_t value_mutex = PTHREAD_MUTEX_INITIALIZER;

Kritikus szakasz kijelölése:

pthread_mutex_lock(&value_mutex);
// Critical section
pthread_mutex_unlock(&value_mutex);

Szál végrehajtásának félbeszakítása

int pthread_cancel(pthread_t thread);

Visszatérési érték:

  • Sikeres végrehajtás esetén 0, egyébként hibakód.

forrás: