V dnešnej časti si povieme o vláknach v operačnom systéme Linux. Naučíme sa vytvárať vlákna a narábať s nimi, joinovať i detachovať vlákna. Taktiež si povieme niečo o chovaní vláken a nebudú chybať ani príklady.
int pthread_create(pthread_t * thread, pthread_attr_t * attr,
void * (*start_routine)(void *), void * arg);
void* NazovFunkcie(void* param)int pthread_join ( pthread_t th, void ** thread_return) int pthread_exit( void * retval ).int pthread_detach ( pthread_t th ). Jediný argument th tejto funkcie je štruktúra typu pthread_t. Táto funkcia nastaví vlákno do stavu detached a potom už vlákno netreba pripájať (join) a teda sa o to vlákno ani netreba už starať z pohľadu iných vlákien. Nevýhodou je to, že nezískame žiadnu návratovu hodnotu z vlákna po jeho ukončení. Aby bolo vlákno detached sa dá docieliť i správnym nastavením atribútov pri vytváraní vlákna.#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//pocet vypisov
#define MAX_LOOPS 10000
//vlakna
pthread_t thread_a, thread_b, thread_c;
//funkcia ktora je telom vlakna
void* Test(void* id)
{
int i;
//informacne vypisy
printf ("Thread %d startedn", *(int*)id );
//cyklus vypisania
for (i =0; i< MAX_LOOPS; i++)
{
//prvy thread vypise a druhy b atd
printf("%c",(int)'a'-1+(*(int*)id));
}
return NULL;
}
int main( void )
{
int a = 1, b = 2, c = 3;
//vytvorenie vlaken
pthread_create (&thread_a, NULL, Test, &a);
//detach
pthread_detach ( thread_a );
pthread_create (&thread_b, NULL, Test, &b);
//detach
pthread_detach ( thread_b );
pthread_create (&thread_c, NULL, Test, &c);
//detach
pthread_detach ( thread_c );
return 0;
}
1.tie zdrojaky tam mas zle a nesedia k tomu co pisesaspon ten posledny kde pises o ukazke mutexov tak tam ziadne mutexy nepouzivasa vo vsetkych zdrojakoch mas v pthread_create funkciu TestMutex ale v zdrojaku mas nazov funkcie Testtakze sa neda ani skompilovat2.a este dva preklepiky urˇčité zýsobník
27. 06. 2006 stano 195.168.3.xxx
Dobry clanok. Mozno, ze som to prehliadol, ale nenasiel som jednu podstatnu vec. Zakladnou jednotkou v Linux je process a nie vlakno. Jadro nevidi vlakna a ked caka proces, cakaju aj vsetky jeho vlakna - t.j. nevyhoda ale zas ked proces necaka je prepinanie kniznicnych vlakien rychlejsie. Vlakna su implementovane len pomocou kniznic a OS sa nestara o ich administraciu,. Preto sa ako parameter pri kompilovani uvadza tiez -lpthread. Na rozdiel od Windowsu, ktory vlakna rozlisuje a preemtivne ich prepina. Ine je to od jadra 2.6, kde uz su vlakna NPTL vytvarane na urovni OS, aj ked stale na preemtivne prepinaie je potrebne prekopat jadro. Tieto clanku tu naozaj chybaju, preco nepises castejsie?
27. 06. 2006 Michal Cizmar 84.47.104.xxx
Michal Cizmar napísal: Dobry clanok. Mozno, ze som to prehliadol, ale nenasiel som jednu podstatnu vec. Zakladnou jednotkou v Linux je process a nie vlakno. Jadro nevidi vlakna a ked caka proces, cakaju aj vsetky jeho vlakna - t.j. nevyhoda ale zas ked proces necaka je prepinanie kniznicnych vlakien rychlejsie. Vlakna su implementovane len pomocou kniznic a OS sa nestara o ich administraciu,. Preto sa ako parameter pri kompilovani uvadza tiez -lpthread. Na rozdiel od Windowsu, ktory vlakna rozlisuje a preemtivne ich prepina. Ine je to od jadra 2.6, kde uz su vlakna NPTL vytvarane na urovni OS, aj ked stale na preemtivne prepinaie je potrebne prekopat jadro. Tieto clanku tu naozaj chybaju, preco nepises castejsie?mylis sa co sa tyka tych kniznicnich vlakien, predchodca nptl, linuxthreads fungoval takym sposobom ze vsetky vlakna boli normalne procesy, iba data v pameti maly zdielane (ked si si zobrazil procesy cez ps tak si videl vsetky thready)btw. -lpthread treba pouzit vzdy aj pri nptlale ano existuju aj implementacie ktore maju vlakna riesenie cisto v userspace ale defaultne v distribuciach bolo linuxthreads (v niektorych este stale je)a co sa tyka scheduleru a nptl vlakien tak si myslim ze sa scheduluju v kernely ako normalne procesy
27. 06. 2006 Anonym 86.110.225.xxx
Michal Cizmar napísal: Dobry clanok. Mozno, ze som to prehliadol, ale nenasiel som jednu podstatnu vec. Zakladnou jednotkou v Linux je process a nie vlakno. Jadro nevidi vlakna a ked caka proces, cakaju aj vsetky jeho vlakna - t.j. nevyhoda ale zas ked proces necaka je prepinanie kniznicnych vlakien rychlejsie. Vlakna su implementovane len pomocou kniznic a OS sa nestara o ich administraciu,. Preto sa ako parameter pri kompilovani uvadza tiez -lpthread. Na rozdiel od Windowsu, ktory vlakna rozlisuje a preemtivne ich prepina. Ine je to od jadra 2.6, kde uz su vlakna NPTL vytvarane na urovni OS, aj ked stale na preemtivne prepinaie je potrebne prekopat jadro. Tieto clanku tu naozaj chybaju, preco nepises castejsie?@prvy post - chyby opravim. diq, moze sa stat, v tomto teple sa sebe ani nedivim. na druhu stranu je to test inteligencie pre citatela :Pzdar.pojdem od konca. nepisem preto, lebo som leniva osoba a posledne som mal skutocne vela okolo usi. Aktualne sa prave hotujem si prestudovat podrobnejsie kernel internals ako linuxu tak windows.Osobne nevidim do kernelu linuxu podorbne a ohladne planovanych entit som bol pravdepodobne misquided od cloveka co mi to tak nejak zle nastinil. Bolo mi povedane ze od kern 2.6 je to podobne ako windows. Asi som tomu len zle rozumel - by bad.
28. 06. 2006 Anonym 195.113.26.xxx
prispevok nad tymto prispevkom je od autora clnaku
28. 06. 2006 vegetta [autor] 195.113.26.xxx
prispevok do diskusie ma inspiroval napisat trosku detialnejsi clanok o linux kerneli - co ale vyzaduje trosku detailnejsie si to cele nastudovat. cize ak su medzi citatelmi nejaky zaujemci o toto, teste sa :) a dufajte ze cez leto bude vela prsat - aby som sa vela nudil
28. 06. 2006 vegetta [autor] 195.113.26.xxx
V Megafoto.sk len za 385 €
Copyright © 2002 - 2012 Inet.sk, s. r. o.Všetky práva vyhradenéNeprešlo jazykovou úpravouISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Webhosting Inet.sk