Toon posts:

[linux] pthreads + systems calls + errno

Pagina: 1
Acties:

Verwijderd

Topicstarter
Veel systems calls in Linux zetten de globale variable "errno" als er iets mis gaat. Globale variabelen geven natuurlijk problemen als je met meerdere threads gaat spelen (en system calls doet vanuit meerdere threads). Volgens de header files in Linux wordt dit als volgt opgelost (errno.h):

C:
1
2
3
4
5
6
7
8
9
/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));

#  if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())
#  endif
# endif /* !__ASSEMBLER__ */
#endif /* _ERRNO_H */


oftwel, errno wordt een macro die een variable terug geeft die de locale errno van een thread zou moeten zijn. Nergens wordt _LIC_REENTRANT verder gedefineerd (behalve in glibc zelf..). Mag ik er dan vanuit gaan dat als je glibc gebruikt geen _LIBC wordt gedefineerd maar iets van GNU_LIBC?

Hoe kan ik detecteren bijv. in een automake/autoconf script of de thread library dit ook support? Behalve op linux, wordt dit ook onder bsd gesupport?
Of is het misschien beter om zelf mutex locks te gaan gebruiken rondom elke system call?

  • seweso
  • Registratie: Augustus 2003
  • Laatst online: 04-04-2018

seweso

de mouw is uit de aap

Het lijkt mij persoonlijk erg onlogisch als je threads kan gebruiken dat zoiets simpels niet zou werken. Gewoon vertrouwen hebben.

Wat ik doe als ik iets niet vertrouw: gewoon testen! Dus in jouw geval:
1. 2 threads aanmaken
2. Allebei de threads een andere fout laten maken
3. Allebei ff laten slapen
4. Allebei de opgevangen fout laten tonen

Tonen ze beide een andere fout dan zit je goed en anders niet :)

seweso's blog