Thread-safe funkce v glibc
Martin Kavalec
xkavm04 na vse.cz
Pondělí Prosinec 20 20:07:33 CET 1999
20 Dec 1999 14:52:00 +0100 v cz.comp.linux Michal Krause napsal:
> On 12/20/99 13:39, Lubos Lunak wrote:
>
> > > mohl by me nekdo nasmerovat nekam, kde si prectu, ktere glibc (2.1)
> > > funkce jsou thread-safe? Nebo jsou to vsechny, pokud je definovan symbol
> > > _REENTRANT?
> >
[snip]
> Diky za vycerpavajici info, je fakt, ze v podstate hledam reentrantni
> funkce, protoze thready operuji nad svymi vlastnimi daty. Spatne jsem se
> vyjadril.
>
> > Jenze porad zustava ten problem, ktere to jsou, ze ? Hledani v manpages
> > je zrejme ztrata casu ( grep tam toho fakt moc nenasel ). V 'info libc'
Taky jsem to hledal a nenasel. Ale v infu ke starsi libc tusim
takovy seznam byl.
Mozna uz je to v glibc vychytane, ze se tim neni treba zabyvat a
funkce ktere pracuji se statickym bufferem jsou uz v libc obkliceny
mutexy... (viz nize)
> Na info jsem docista zapomnel (je s podivem, ze za tu dlouhou dobu, co
> pouzivam Linux jsem si na nej oproti manu nejak nezvyknul).
taky mi 'man neco' prijde rychlejsi nez 'info neco' a pak se
dohrabavat kyzene informace. Ale info k libc je pekne napsane a
dost veci jsem se z toho naucil. A ma i rejstrik, takze kdyz
stisknu 'i' je to uz skoro jako man :-)
[snip]
> > > Jak je to s ekvivalenty s _r? Napriklad gethostbyaddr_r rve, ze ma
> > > nespravny pocet parametru (kdyz jsem pouzil to same, co u normalniho
> > > gethostbyaddr), ale man se k temhle funkcim nezna. Kde tedy zjistim, jak
> > > se ma spravne volat?
info '(libc)Host Names'
> > Jinak to _REENTRANT jen znamena, ze se spravne udela per-thread errno
> > promenna a take reentrantni verze funkci, ktere jinak pouzivaji static.
> > Napr. gethostbyname() vraci tusim static, takze neni ani reentrant. _r
> > verze funkci obycejne berou navic parametr(y), ktere urcuji, kam se maji
> > ulozit ta data, ktera by jinak sla do static. ( Kdyz uz jsme u
> > gethostbyname_r(), udajne je to pekne nepovedena bestie a je lepsi na to
> > udelat treba fork() a volat normalni gethostbyname()).
>
> Brr. Preci nebudu kvuli gethostbyaddr predelavat cely program? To snad
> radeji udelam jeden specialni thread pro resolvovani nebo ...
> > Jo, a jeste, pokud ta funkce bude volana jen v jednom threadu ( jedno v
> > kterem ) a jsou spravne veci kolem errno a tak, tak samozrejme pak by
> > mela byt v poradku kazda takhle volana funkce. Nebo se ta volani daji
> > hlidat mutexem.
>
> ... opravdu pouziju ten mutex. Vykonostne to bude asi totez a na
> implementaci snazsi.
Kdysi jsem se taky snazil napsat jeden programek reentrantni
a pri pouzivani gdb jsem ziskal dojem, ze pri kompilovani
s _REENTRANT jsou ty mutexy uz primo v libc -- pokud nejaky
thread resolvoval a jiny chtel taky, pak ten druhy visel na
nejakem mutexu, ktery jsem tam urcite nedaval.
> > A nebo si slabsi povahy z toho muzou hodit masli. Thready
> > dneska holt jeste nejsou zadna sranda.
>
> Koukam...
Taky jsem to nakonec predelal na samostatne procesy komunikujici
pres PF_UNIX socket :-| (ale bylo to proto, ze jsem tam mel jine
bugy, ktere se mi v tech threadech spatne hledaly; navic jsem se
snazil nezavrit si cestu zpatky ke threadum, kdyby to nekdy bylo
potreba)
Zdravi
martin
Další informace o konferenci Linux