Hlavní navigace

Programování pod Linuxem pro všechny (13)

Jakub Matys 23. 4. 2004

Dnes si povíme něco o identifikačních číslech vláken, atributech vláken a rušení vláken. Pokud vás toto téma zajímá, nebo prostě čtete tento seriál pravidelně, neváhejte a vejděte...

Identifikační čísla vláken

Občas je důležité zjistit, jaké je identifikační číslo vlákna. To může zjistit funkce pthread_self(), která zjistí identifikační číslo volajícího vlákna. Toto číslo může být porovnáno s identifikačním číslem jiného vlákna, a to pomocí funkce pthread_equal().

Uvedené funkce mohou být užitečné, když je nutné zjistit, zda konkrétní vlákno odpovídá aktuálnímu vláknu. Pokud totiž vlákno zavolá funkcipthread_jo­in() samo na sebe, vznikne chyba (funkce vrátí chybový kód EDEADLK). K ověření těchto skutečností můžete použít kód podobný tomuto:

if(!pthread_equal(pthread_self(), other_thread)
  pthread_join(other_thread, NULL);

Atributy vláken

Atributy vláken poskytují mechanismus pro detailní modifikaci jejich chování. Funkce pthread_create() má totiž argument, jenž je ukazatelem na objekt zvaný atributy vlákna. Pokud předáte prostřednictvím tohoto argumentu nulový ukazatel, použijí se ke konfiguraci implicitní atributy. Můžete však specifikovat jiné atributy, a definovat tak jiné chování vlákna. Při specifikaci atributů vlákna se postupuje podle následujících kro­ků:

  1. Vytvoříte objekt pthread_attr_t. Nejjednoduší způsob spočívá v tom, že použijete automatickou proměnnou tohoto typu.
  2. Zavoláte funkci pthread_attr_i­nit(), které předáte ukazatel na zmíněný objekt prostřednictvím argumentu. Tak inicializujete atributy na implicitní hodnoty.
  3. Objekt s atributy modifikujete podle potřeby.
  4. Ukazatel na objekt s atributy předáte funkci pthread_create() při jejím volání.
  5. Objekt s atributy uvolníte pmocí funkce pthread_attr_des­troy(). Samotná proměnná pthread_attr_t však není dealokována. Můžete ji znovu inicializovat pomocí funkce pthread_attr_i­nit().

Jediný objekt s atributy vlákna může být použit k inicializaci několika vláken. Není nutné objekt s atributy uchovávat poté, co jsou požadovaná vlákna vytvořena.

Pro většinu aplikací v Linuxu se obvykle využívá pouze jeden atribut vlákna (ostatní mají význam pro speciální aplikce, např. takové, které běží v reálném čase). Tento atribut se nazývá stav odloučení. Každé vlákno může být vytvořeno jako spojitelné nebo odloučené. Spojitelné vlákno, podobně jako proces, není automaticky uklizeno operačním systémem, když ukončí svou činnost. Místo toho zůstane v systému v podobě blízké procesu zombie, dokud jiné vlákno nezavolá funkci pthread_join(), aby získalo jeho návratovou hodnotu. Pak jsou systémové zdroje vlákna uvolněny. Odloučené vlákno je naopak automaticky odklizeno, jakmile ukončí svou činnost. Z tohoto důvodu s ním nemůže synchronizovat svou činnost žádné jiné vlákno prostřednictvím funkce pthread_join(). Žádné jiné vlákno také nemůže získat návratovou hodnotu odloučeného vlákna.

K nastavení odloučeného stavu atributu vlákna použijte funkci pthread_attr_set­detachstate(). Prvním argumentem je ukazatel na objekt atributů vlákna a druhým je požadovaný stav. Protože stav odloučení není implicitní, je tato funkce nutná jen pro vlákna odloučená. Jako druhý argument používejte jméno jméno PTHREAD_CREATE_DE­TACHED.

#include <pthread.h>

void *thread_function(void *thread_arg)
{
  /* Vlakno zde provadi nejake operace */
}

int main()
{
  pthread_attr_t attr;
  pthread_t thread;

  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  pthread_create(&thread, &attr, &thread_function, NULL);
  pthread_attr_destroy(&attr);

  /* Program dale pokracuje v realizaci kodu */

  return(0);
} 

Dokonce i v případě, že je vlákno vytvořeno ve spojitelném stavu, může být později konvertováno na odloučené vlákno. Jakmile je však vlákno jednou definováno jako odloučené, nemůže být konvertováno na spojitelné.

Zrušení vlákna

Za normálních okolností končí vlákno buď návratem z funkce vlákna, nebo voláním funkce pthread_exit(). Je ovšem možné požadovat, aby jedno vlákno ukončilo jiné. Takovému procesu se říká zrušení (cancelling) vlákna.

Ke zrušení vlákna slouží funkce pthread_cancel(), které se předává jako parametr identifikační číslo vlákna, jež se má zrušit. Zrušené vlákno může být později spojeno (pokud se nejedná o odloučené vlákno). Návratová hodnota zrušeného vlákna je speciální – PTHREAD_CANCELED.

Tak to by bylo pro dnešek vše. Příště si povíme o tom, jak obhospodařit kód vlákna, který se NESMÍ zrušit.

Našli jste v článku chybu?

26. 4. 2004 13:09

Tomas Kolda (neregistrovaný)

Napsal jsem aplikaci, ktera umoznuje paralelni vypocet. Kdyz jsem ho prepsal do vlaken a spoustel na mem notebooku, tak vse bezelo v pohode jak jsem ocekaval. Tesil jsem se jak vse bude "frcet" na 4 cestnem Opteronu v praci a ono houby. Program bezel mnohem POMALEJI!!!

Hledal jsem jak silenej na internetu a pry to ma co docineni s pameti a cache. Pouzivam tam hojne STL struktury. Zkousel jsem i projekt hoard, ale bez vysledku. Nevite nekdo jak donutit STL, aby alokovalo pro kazde vlakno jinde…

24. 4. 2004 10:07

Tomas Janousek (neregistrovaný)

Bylo by dobre poznamenat, ze vlaken bez atributu, ktere nejoinneme, lze vytvorit (nikoliv zaroven) jenom urcity pocet, pokud poskytneme atributy (at uz treba prazdne), je tento pocet kupodivu o trochu vetsi. Detachovanych vlaken muzeme pochopitelne vytvaret kolik chceme. (zase nemluvim o soucasnem behu)

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?