vlakna
Karel Zak
zakkr na zf.jcu.cz
Čtvrtek Prosinec 13 11:01:57 CET 2001
On Thu, Dec 13, 2001 at 08:06:42AM +0100, sci wrote:
> Dobry den,
> pokousel jsem se napsat aplikaci s vice vlakny a narazil jsem na
> nasledujici problem.
> Jedno vlakno cte ze seriove linky data a radi je do "fronty", tj. ve
> skutecnosti vytvari linearni spojovy seznam, ktery pouziva dynamicky
> alokovanou pamet. Dalsi vlakno odebira jednotliva data z fronty,
> zpracovava je a vytvari jinou frontu dat. Ta jsou nakonec jinym vlaknem
> zasilana pres TCP jine aplikaci.
> Obdobne to bezi i obracene ve smeru od TCP az k seriove lince.
> Jednotliva vlakna jsou vytvorena za pouziti funkce "pthread_create" a
> pristup ke spojovym seznamum je rizen pomoci semaforu. Pri pokusu o
> uvolneni dynamicky alokovane pameti aplikace "spadla" s hlasenim o
> neopravnem pristupu do pameti.
> Metodou pokusu a omylu jsem zjistil, ze pamet lze dynamicky alokovat a
> pak opet uvolnit bez vyse uvedenych problemu, byla-li alokovana v tzv.
> hlavnim vlakne procesu, tj. v te casti procesu, ktera ostatni vlakna
> vytvari. Pokusil jsem se proto pomoci semaforu ridit dynamicke
> pridelovani a uvolnovani pameti pro potreby uvedenych spojovych seznamu,
> ale asi to neni moc dobre naprogramovane, protoze mi obcas pravdepodobne
> uspi vsechna vlakna a aplikace tak stoji.
Semaforem myslite semafor z IPC? To bych asi ve spojenim s thready
nepouzival. Kouknete na pthread_mutex_lock a pthread_cond_wait a
podobne funkce. Neco malo o pthread bylo v nejakych starych
Linuxovych novinach.
V te alokaci nevidim problem pokud si budete jist, ze ve chvili kdy
manipulujete (free/realloc) s pameti s ni jiny thread neco nedela.
Pokud je to seznam tak by asi melo byt osetreno, aby neodkazoval
nekam kde uz to je odalokovano apod. Mel by byt zaruceno, aby
thread pracoval s konzistentnim seznamem (typicky v nejakem cyklu
while(x){ x = x->next; ...} kde jiny thread prehazuje/rusi elementy
toho seznamu).
Urcite to neni tak, ze alokovat muze jen "hlavni proces".
Karel
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz
Další informace o konferenci Linux