Forum Programmation.c fonctions standards thread-safe ?

Posté par  (site web personnel) .
Étiquettes : aucune
0
2
juin
2005
Salut, je suis occupé à programmer un memory-manager totalement thread-safe à partir d'un que j'ai récupéré sur internet. Il y a du travaille mais ça avance.

Mais voilà, je voulais savoir si la fonction fprintf est thread-safe. Car si un thread commence à écrire un morceau de texte puis que l'autre prend la relève et commence sa partie, etc. on risque d'avoir des mélanges. Alors voilà, je voulais savoir s'il faut que je gère cela moi même en plaçant mes propres petits pthread_mutex_t.

Merci
bye
  • # Si j'ai bien saisi

    Posté par  . Évalué à 3.

    tu n'as pas à t'occuper de ça en temps normal ; les fonctions de la bibliothèque standard ne sont pas réentrantes (thread safe) par défaut, mais à partir du moment où tu compiles avec l'option -lpthread, ce sont les versions réentrantes des fonctions dont tu as besoin qui sont utilisées.

    Tout ça me reste de la lecture d'un chapitre du livre "Beginning linux programming" dédié aux threads posix, dont je consens à t'envoyer un petit extrait, dans ma grande bonté, à ta demande par courrier.
    • [^] # Re: Si j'ai bien saisi

      Posté par  (site web personnel) . Évalué à 3.

      Non, le -lpthread ne suffit pas. Il faut, dès l'étape de compilation, rajouter le define _REENTRANT (ie passer -D_REENTRANT à gcc). C'est de première importance pour (entre autres) "errno" (variable partagée sans le define, macro utilisant une variable __thread ou un appel à un truc genre pthread_getspecific avec le define).

      Toutes fonctions marquées "MT-safe" dans le man deviendront réentrantes. Il y a des exceptions (gethostbyname, gethostent, etc...) mais elles ont leur equivalent reentrant (suffixe "_r"). RTFM.

      Donc printf deviendra reentrant, au sens ou si tu veux afficher "abcd", tu auras toujours 'a' 'b' 'c' 'd' affiches dans cet ordre et sans risque de bug aleatoire. Mais aucune synchro n'est prise pour que 2 printf ne s'entrelacent pas. Ce qui veut dire qu'un printf("abcd") peut tres bien s'entrelacer avec un printf("efgh").

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.