IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

errno : thread safe ?


Sujet :

POSIX C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut errno : thread safe ?
    Bonjour,

    Je développe actuellement une application multi-threadée et dans plusieurs des threads qui compose mon programme je fais appel à des fonctions susceptibles de modifier la variable globale errno (comme par exemple recv). J'aurais aimé savoir si un mécanisme a été prévu pour empêcher les accès concurrents à errno ou bien si cette tâche est la charge du programmeur (en l'occurence moi).

    D'avance merci.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Montag Voir le message
    Je développe actuellement une application multi-threadée et dans plusieurs des threads qui compose mon programme je fais appel à des fonctions susceptibles de modifier la variable globale errno (comme par exemple recv). J'aurais aimé savoir si un mécanisme a été prévu pour empêcher les accès concurrents à errno ou bien si cette tâche est la charge du programmeur (en l'occurence moi).
    Il y a un errno par processus. Il est donc effectivement commun à tous les threads d'un même processus. Il n'y a aucun mécanisme intégré pour protéger errno. Comme ce sont les fonctions de la bibliothèque qui le modifient, tout peut arriver.

    On peut dire que errno n'est pas utilisable du tout en multithread, à moins de placer les appels de fonctions dans des zones critiques (non interruptibles).

    Il semblerait néanmoins que dans la pratique, l'usage, notamment des pthreads se fasse avec une valeur protégée de errno.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Cela dépend de la plate-forme, car errno peut être une macro et non une simple variable globale.

    Le runtime C de Microsoft accorde un errno par thread, ce qui rend errno thread-safe sous Windows.
    Ailleurs, rien ne peut être dit : Le comportement de errno en multithread n'est pas standardisé, car le C standard n'a pas la notion de multithread.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le runtime C de Microsoft accorde un errno par thread, ce qui rend errno thread-safe sous Windows.
    Bon à savoir, mais piégeant si on ecrit du code portable...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet.
    Les effets du multithread sur les fonctionnalités standard non-réentrantes devraient toujours être spécifiés dans la documentation de l'API de multithreading utilisée...

    J'ignore si c'est effectivement spécifié ou non, mais ça fait de errno une source d'incompatibilité entre APIs de multithreading...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Montag Voir le message
    Apparemment, la question est laissée sans réponse...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Apparemment, la question est laissée sans réponse...
    En fait il y a une réponse mais elle n'est pas très claire (en tout cas pour moi) :
    On thursday, march 7, 2002, at 05:52 , christophe dore wrote:
    Yes, in all good thread-safe environnement, errno should be thread-safe.

    On Linux, (I dunoo for OSX) the #defined variable _REENTRANT helps the compiler to choose, for errno and other dual API, xhat must be actually used.

    In my make files, I used to write things like

    ifeq $(USE_THREADS) "YES"
    CFLAGS += -D_REENTRANT -lpthread.

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    POSIX.1c demande que errno soit thread-safe:
    Some functions may provide the error number in a variable accessed through the symbol errno. The symbol errno is defined by including the header <errno.h>, as specified by the C Standard [...] For each thread of a process, the value of errno shall not be affected by function calls or assignments to errno by other threads.
    mais dans un meme temps, les fonctions POSIX preferent retourner un code d'erreur que d'utiliser errno...

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    POSIX.1c demande que errno soit thread-safe:
    Some functions may provide the error number in a variable accessed through the symbol errno. The symbol errno is defined by including the header <errno.h>, as specified by the C Standard [...] For each thread of a process, the value of errno shall not be affected by function calls or assignments to errno by other threads.
    mais dans un meme temps, les fonctions POSIX preferent retourner un code d'erreur que d'utiliser errno...
    Oui mais POSIX ne précise pas comment rendre errno thread-safe. La seule solution est-elle, comme Emmanuel l'a suggéré de protéger l'appel à des fonctions non-réentrantes avec des mutex ou des sémaphores ou bien y a t'il des solutions moins lourdes comme le suggère mon post précédent

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne peux rendre errno thread-safe avec des sections critiques, puisque le programme utilisateur ne peut pas réserver ces sections.

    Le plus simple est de faire des variables séparées pour chaque thread:
    • Dans l'exemple de ton lien, errno utilise la fonction __error(), qui retourne un pointeur.
    • Dans la CRT de Microsoft, c'est là même chose, sauf que j'ai en plus le code source de la fonction __error() : Elle retourne un pointeur vers une zone mémoire spécifique au thread en cours.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. fonction de stdio.h thread safe ??
    Par boolzor dans le forum POSIX
    Réponses: 3
    Dernier message: 30/04/2006, 20h03
  3. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  4. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  5. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo