Jak zjistit, ze program je threadovany

Michal Dobes dobes na tes.eu
Pondělí Říjen 8 09:24:52 CEST 2007


Petr Janda napsal(a):
> No a nejak nejsem schopen zjistit, jestli se ta aplikace threaduje, nebo
> ne. Google mi odpovida tak, ze sice uz vim o threadech kde co, ale tohle
> stale zjistit neumim. 

Spravna odpoved je trochu ovlivnena tim, jake mate jadro, jaka
threadovaci knihovna v nem je a par malickosti dalsich, ale
pokud je vse zhruba aktualni, tak bych zkusil na vypis procesu:
ps -eLf
Bude-li pro ten vas zkoumany proces existovat vic radku ve vypisu
s tim, ze budou mit stejny PID a ruzne LWP, tak je to aktualne
vicevlaknova zalezitost.

Petr Janda napsal(a):
 > Napadlo me reseni - proste vytvorim statickou promennou a nebudu pamet
 > opakovane alokovat - mohlo by to fungovat, ale s thready si to rozumet
 > nebude.

Samozrejme "staticka" promenna, ktera ma svou hodnotu zavislou dle
daneho vlakna vytvorit jde (bez toho by nefungoval korektne ani errno
ve vicevlaknovych programech). Rika se tomu thread specific data (TSD),
nekdo thread local storage (matouci TLS) a obsah takove promenne zavisi
na tom, z jakeho vlakna do toho koukate.
Jestlize-ze ta promenna neni moc velka struktura a je pouzit GCC
kompilator na podporovane platforme, tak staci pridat pred definici
takove promenne __thread a je to. :-) Pouzivate jako normalni globalni
promennou, jen pro kazde vlakno existuje lokalni kopie s vlastni
hodnotou. Ta promenna v podstate vznikne na zasobniku vsech vlaken,
takze 10 MB velky objekt neni dobra volba, pak je vhodnejsi pouzit POSIX
implementaci s opicarnama kolem
pthread_once/pthread_getspecific/pthread_setspecific.

M.




Další informace o konferenci Linux