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

Langage C++ Discussion :

static + REENTRANT


Sujet :

Langage C++

  1. #21
    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
    Citation Envoyé par Mac LAK Voir le message
    Je reformule : tu n'as pas de garantie qu'il soit complet, ce contexte... Si tu préfères, tu ne sais pas si ta callback est réentrante ou pas. Si elle n'est pas réentrante, toute fonction l'utilisant ne peut PAS être réentrante.
    Pour moi, elle est réentrante si on peut l'appeler de la callback sans problème, non?
    C'est justement de la callback elle-même que vient le risque d'utilisation récursive, donc si la fonction n'appellait pas de callback, je n'aurais pas de besoin de d'empiler ma variable persistante...

    Typiquement, dans le code que tu montres, tu présupposes (tacitement, vu l'absence de SC) que l'affectation de la globale ou son incrémentation sont atomiques
    Non, je présuppose que la globale n'est pas une vraie globale, mais du TLS (d'où le __declspec(thread) parce que j'avais la flemme d'écrire le code de gestion explicite du TLS dans un simple code d'exemple). J'aurais aussi bien pu "supposer que l'expérience de déroule dans le cadre d'un programme monothread"...
    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.

  2. #22
    screetch
    Invité(e)
    Par défaut
    j'aurai envie d'etre plus strict que ca avec ta reentrance medinoc.
    le problème c'est que ta fonction elle-même est réentrante, mais si tu lui passes une callback non réentrante, qui se rappelle elle-même?

    une fonction est réentrante si toute les fonctions qu'elle appelle sont aussi réentrantes.

  3. #23
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour moi, elle est réentrante si on peut l'appeler de la callback sans problème, non?
    Oui, si c'est bien "quel que soit le cas de figure"... Notamment de l'appeler avec les mêmes paramètres.
    Mais tu n'as PAS le source de la callback en question pour le prouver, c'est ça le problème... Donc, tu ne peux pas affirmer que la fonction est intrinsèquement réentrante.

    Citation Envoyé par Médinoc Voir le message
    Non, je présuppose que la globale n'est pas une vraie globale, mais du TLS
    Cela ne change pas le problème : si tu réentres (via la callback) dans ta fonction, tu vas taper dans la même valeur.
    Or, même si c'est probablement le cas avec un int, tu ne peux pas garantir que l'utilisation de cette globale ne posera pas de problèmes s'il y a récursion.
    Dans le principe GLOBAL, il y a un risque, donc elle n'est pas réentrante (principe de précaution).

    Après, je le redis, tu as trois tonnes d'implémentations de fonctions non-réentrantes et/ou non-thread-safe qui marchent très bien avec de la concurrence à fond les ballons, parce que l'on s'est mis dans un cas spécifique permettant de ne pas déclencher les problèmes intrinsèques des fonctions. Pour moi, ton exemple est typiquement dans cette catégorie : fonction non-réentrante d'un point de vue théorique, mais qui n'a pas de problème dans son contexte d'utilisation bien cadré.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #24
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    @Mac Lak : je suis d'accord, nos 2 définitions sont plus ou moins équivalentes. Et je ne vois pas en quoi wiki ne dit pas la même chose que nous : la réentrance est liée à l'interface de la fonction puisqu'on y exporte le contexte, et thread-safety est interne à la fonction. Là où wiki se fourvoie à mon sens c'est quand il dit que réentrance implique thread-safety.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int f(int &i)
    {
       return ++i;
    }
    Voilà pour moi une fonction réentrante mais pas thread-safe.

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int f(int &i)
    {
       return ++i;
    }
    Voilà pour moi une fonction réentrante mais pas thread-safe.
    Elle n'est pas thread-safe si on lui passe une variable globale ou statique, on est d'accord ?
    En effet, si on lui passe une variable locale du thread, ça ne posera pas de problème !

  6. #26
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Et je ne vois pas en quoi wiki ne dit pas la même chose que nous : la réentrance est liée à l'interface de la fonction puisqu'on y exporte le contexte, et thread-safety est interne à la fonction.
    Tout comme toi, ce n'est pas ce point-là de l'article que je conteste.

    Citation Envoyé par 3DArchi Voir le message
    Là où wiki se fourvoie à mon sens c'est quand il dit que réentrance implique thread-safety.
    Exactement : pour moi, c'est l'inverse.

    Citation Envoyé par 3DArchi Voir le message
    Voilà pour moi une fonction réentrante mais pas thread-safe.
    En effet, on est d'accord.

    Citation Envoyé par jamin Voir le message
    Elle n'est pas thread-safe si on lui passe une variable globale ou statique, on est d'accord ?
    En effet, si on lui passe une variable locale du thread, ça ne posera pas de problème !
    Ce qui revient au même cas que celui de Médinoc : tu peux l'utiliser avec des threads concurrents sans avoir de problèmes, et comme tu le dis toi-même, cela dépend de la portée de la variable passée en paramètre.
    Mais ça ne veut pas dire qu'elle est intrinsèquement thread-safe : passe la même donnée "i" via deux threads concurrents, et tu t'exposes à des problèmes.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #27
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Exactement : pour moi, c'est l'inverse.
    C'est là ou je suis pas d'accord ! On peut avoir une fonction thread-safe mais non-réentrante oO !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  8. #28
    screetch
    Invité(e)
    Par défaut
    je me demande si on a pas besoin de plus de "tags" a la const en C++; un tag "global" qui montrerait qu'une variable est globale, et si une fonction veut modifier une variable marquée globale alors elle doit le dire de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int f(int &i) // reentrante
    {
       return ++i;
    }
    int f(global int &i) // non reentrante
    {
       return ++i;
    }
    ainsi, si un objet, meme si c'est un pointeur, est local, alors tout ce qu'il pointe est local (sauf si cela contient la mention "global")
    et l'inverse : si un pointeur est global, tout ce qui est pointé l'est aussi. Un peu comme le const.

    le fait que par défaut une donnée soit locale et pas globale a aussi un sens
    et il serait impossible de passer de local a global ou de global a local car on a aucune garantie.
    Aussi, si un objet est local, on sait tout de suite qu'il n'a pas a etre protégé de "race conditions"

  9. #29
    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
    On peut même avoir ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void f(int *pi, int *pj)
    {
    	++(*pi);
    	InterlockedIncrement(pj);
    }
    Cette fonction est réentrante, utilise pj de manière thread-safe, mais pi de manière non-thread-safe.

    En programmation objet, ça se rencontre assez souvent dans des cas où pj est this.
    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.

  10. #30
    screetch
    Invité(e)
    Par défaut
    j'avoue que j'ai beaucoup de problème avec votre définition ultra laxiste de "réentrante"
    a partir du moment ou il y a un pointeur ou une référence alors une fonction n'est plus réentrante selon moi. Mais ca peut etre juste mon interpretation. Mais cacher un contexte sous le tapis puis dire que tout est local, je trouve ca un peu abusé.

  11. #31
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par screetch Voir le message
    je me demande si on a pas besoin de plus de "tags" a la const en C++; un tag "global" qui montrerait qu'une variable est globale, et si une fonction veut modifier une variable marquée globale alors elle doit le dire
    Je crois que c'est un peu l'objectif des propositions pour avoir la notion de fonction "pure" (mais formulée dans l'autre sens). Le gros problème étant que ça ne se marie pas forcément bien avec la compilation séparée.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #32
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Lavock Voir le message
    C'est là ou je suis pas d'accord ! On peut avoir une fonction thread-safe mais non-réentrante oO !
    T'as un exemple ?
    Je pense que si tu en donnes un, on pourra voir que soit elle n'est pas thread-safe, soit elle est en fait réentrante...

    Pour info : protéger une fonction par un mutex qui lui est propre, et acquis sur la totalité de l'exécution de la fonction (typiquement, un mutex static local acquis en RAII), rend la fonction réentrante...

    En effet, quels que soient les paramètres de la fonction et le contexte d'exécution de l'appelant, la fonction peut s'exécuter en parallèle, car son contenu devient atomique (et les opérations atomiques n'ont jamais été une cause de problème en parallélisme, bien au contraire).
    Or, le mutex étant pris et relâché au sein même de la fonction, tu as bel et bien, à un instant T, les deux fonctions en exécution simultanée (une qui "bosse", l'autre bloquée sur la prise de mutex)... Ce qui la rend réentrante, ainsi que thread-safe bien entendu.

    L'exemple serait faux (et la fonction ni thread-safe, ni réentrante) si tu encadrais l'appel de la fonction par la prise d'un mutex : dans ce cas de figure, c'est l'appelant qui est thread-safe, et non pas la fonction appelée.

    Citation Envoyé par Médinoc Voir le message
    Cette fonction est réentrante, utilise pj de manière thread-safe, mais pi de manière non-thread-safe.
    Effectivement : réentrante, mais pas thread-safe... Et non pas le contraire.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #33
    screetch
    Invité(e)
    Par défaut
    strtok, protégée avec un gros mutex, n'est toujours pas réentrante. ton affirmation est globalement fausse.

  14. #34
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par screetch Voir le message
    strtok, protégée avec un gros mutex, n'est toujours pas réentrante. ton affirmation est globalement fausse.
    L'interface de strtok n'est pas réentrante car elle ne fournit pas son contexte... Bien qu'il y aie des implémentations, telle que celle de Visual, qui fournisse une version réentrante.

    Intrinsèquement, strtok n'est donc pas réentrante, c'est d'ailleurs un cas classique de "mauvaise fonction". Après, suivant l'implémentation, elle peut le devenir : augmentation de la signature pour prendre le contexte, contexte stocké dans le TLS et mutex global sont par exemple de bonnes façons d'y arriver.

    Après, si ton implémentation de strtok, malgré son "gros mutex", possède un contexte global unique (pas dans le TLS, donc), alors elle n'est ni thread-safe, ni réentrante. Si son contexte est local au thread, alors elle devient réentrante et thread-safe.

    Si tu veux me prouver qu'une fonction est thread-safe tout en n'étant pas réentrante, merci d'en poster le code source.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  15. #35
    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
    Citation Envoyé par Mac LAK Voir le message
    Si tu veux me prouver qu'une fonction est thread-safe tout en n'étant pas réentrante, merci d'en poster le code source.
    L'implémentation Microsoft de toutes les fonctions non-réentrantes de la bibliothèque C: strtok(), strerror()...
    Pourquoi? Parce que cette implémentation utilise des contextes locaux au thread, à grand renfort de TLS. Mais ces fonctions n'en deviennent pas réentrantes pour autant.
    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.

  16. #36
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    De mon expérience, la réentrance est à la base une contrainte des gestionnaires d'interruptions et à peu à voir avec la programmation concurrente. Il s'agit surtout de garantir qu'un tel gestionnaire peut être interrompu de manière sûre. Une fonction doit être réentrante pour pouvoir être appelée lors du traitement de la première ou second interruption.
    Sans y avoir trop réfléchi, je me demande si l'articulation entre réentrance et thread-safety (pour les cas non triviaux) ne se joue pas selon la façon dont le mutex est géré et selon son type (possibilité d'être locké 2 fois dans le même thread ou pas).

  17. #37
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Mac LAK
    Pour info : protéger une fonction par un mutex qui lui est propre, et acquis sur la totalité de l'exécution de la fonction (typiquement, un mutex static local acquis en RAII), rend la fonction réentrante...
    Citation Envoyé par Mac LAK
    Après, si ton implémentation de strtok, malgré son "gros mutex", possède un contexte global unique (pas dans le TLS, donc), alors elle n'est ni thread-safe, ni réentrante
    tu te contredis la. Je crois que tu n'as pas compris le problème de la réentrance

  18. #38
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    L'implémentation Microsoft de toutes les fonctions non-réentrantes de la bibliothèque C: strtok(), strerror()...
    Pourquoi? Parce que cette implémentation utilise des contextes locaux au thread, à grand renfort de TLS. Mais ces fonctions n'en deviennent pas réentrantes pour autant.
    Si, pourtant : elles le sont, car avec un mutex, elles ne peuvent plus être (réellement) interrompues par elles-mêmes, et deviennent thread-safe (et réentrantes grâce au TLS). Et sans les mutex, et malgré le TLS, elles ne sont plus réellement thread-safe : en effet, l'utilisation du TLS te garantit que la variable est unique pour chaque thread, mais pas qu'elle sera protégée en cas d'accès concurrent !!

    Même si je te concède bien volontiers qu'il sera dans ce cas assez difficile, hors d'un ISR, de pouvoir déclencher le cas d'erreur... Mais ce n'est pas parce qu'une fonction "résiste" à du multi-threading qu'elle est intrinsèquement thread-safe !

    Citation Envoyé par 3DArchi Voir le message
    De mon expérience, la réentrance est à la base une contrainte des gestionnaires d'interruptions et à peu à voir avec la programmation concurrente. Il s'agit surtout de garantir qu'un tel gestionnaire peut être interrompu de manière sûre. Une fonction doit être réentrante pour pouvoir être appelée lors du traitement de la première ou second interruption.
    C'est également un autre cas de réentrance, qui certes n'est jamais vu par ceux qui ne touchent jamais au bas niveau. Mais on en revient peu ou prou à la même chose : a-t-on un contexte explicite, ou un contexte implicite ? En cas de contexte implicite, est-ce que le précédent est sauvegardé, et intact, par le déclenchement d'une ISR ? Mais là, ça dépend aussi du matériel, donc il n'est pas forcément possible de dire, d'après son unique code source, si une ISR est réentrante ou pas sans savoir comment se comporte le contrôleur d'interruptions...

    Citation Envoyé par 3DArchi Voir le message
    Sans y avoir trop réfléchi, je me demande si l'articulation entre réentrance et thread-safety (pour les cas non triviaux) ne se joue pas selon la façon dont le mutex est géré et selon son type (possibilité d'être locké 2 fois dans le même thread ou pas).
    Pour ma part, je n'utilise jamais de mutex ne pouvant pas être lockés plusieurs fois par le même thread : cela pose de trop gros problèmes lors du chaînage d'appels de fonctions, et des possibilités de descheduling si l'on relâche/reprends un mutex non-récursif... C'est plutôt le concept de "mutex non-récursif" qui me semble aberrant à utiliser de façon générale, du moins en dehors du code interne des primitives des objets de synchronisation... Même un objet aussi simple que le CRITICAL_SECTION Win32 est récursif !

    Après, il est évident qu'utiliser un mutex non-récursif ne peut PAS rendre la fonction ni réentrante, ni thread-safe, vu que la moindre tentative de réentrance aboutit à un deadlock direct... J'ose espérer que personne sur ce topic n'a osé imaginer que le terme "mutex tout court" pouvait recouvrir un mutex NON-récursif !
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  19. #39
    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
    Attends une minute: Pour moi, si une fonction est vulnérable à une interruption, ce n'est pas une question de thread-safety: On sort de la programmation multithread et on passe à de la programmation interruptible, qui est un tout autre domaine, avec des protections différentes (masquage de signal, etc.)

    Tant qu'on n'est pas en programmation interruptible, une fonction ne peut être "dérangée" qu'aux moments où elle le veut bien: Appels de fonctions callback, SendMessage() de Windows, etc.
    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.

  20. #40
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attends une minute: Pour moi, si une fonction est vulnérable à une interruption, ce n'est pas une question de thread-safety: On sort de la programmation multithread et on passe à de la programmation interruptible, qui est un tout autre domaine, avec des protections différentes (masquage de signal, etc.)
    Ce n'est pas un domaine si différent que ça, en fait, la seule différence est qu'au niveau ISR, la plate-forme matérielle est un des éléments du contexte global de chaque fonction.

    Citation Envoyé par Médinoc Voir le message
    Tant qu'on n'est pas en programmation interruptible, une fonction ne peut être "dérangée" qu'aux moments où elle le veut bien: Appels de fonctions callback, SendMessage() de Windows, etc.
    Non : tu peux te faire descheduler à n'importe quel moment, et c'est hors de tout contrôle sur un OS à multitâche préemptif...
    Il n'y a qu'en MT coopératif que tu peux (presque) garantir les emplacements de changement de contexte.

    Il n'en reste pas moins vrai que les ISR existent sur ton OS, et que tu n'as PAS le contrôle dessus : en conséquence, ton code peut toujours être interrompu par un ISR, et rien ne te garantit qu'il n'utilise pas la "mauvaise" fonction... C'est pour ça que je parle de fonctions résistantes au MT "courant", mais qui peuvent parfaitement ne pas être intrinsèquement thread-safe.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. thread et méthodes static
    Par sylpichard dans le forum MFC
    Réponses: 3
    Dernier message: 02/06/2004, 17h12
  2. Problème avec l'option -static de gcc
    Par lsdInside dans le forum Linux
    Réponses: 2
    Dernier message: 08/05/2004, 01h01
  3. [Débutant(e)] JSP utilisation static....une autre
    Par tcgenrecom dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/03/2004, 15h27
  4. Mais que fait static ???
    Par elsargento dans le forum C
    Réponses: 4
    Dernier message: 25/09/2003, 09h55
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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