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

C++ Discussion :

Threads et C++


Sujet :

C++

  1. #1
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut Threads et C++
    Bonjour,

    Non je n'utilise pas boost.


    Je voulais savoir, lorsqu'on détruit un thread avec le méchant KillThread() d'une bibliothèque C, est-ce que les destructeurs ont le temps d'être appelé? Sinon je risque de me retrouver avec un problème avec les strings...

    De même, est-ce que si on appelle une fonction dans le thread, elle se termine même si on tue le thread? (Par exemple si je fais une fonction dangereuse du genre un string::swap(), y'a-t-il des risques?)

    Merci de votre aide

  2. #2
    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
    KillThread n'est pas une fonction C standard, je ne sais pas de quelle bibliothèque elle vient. La réponse peut dépendre.

    Si elle est vraiment "méchante", la réponse est non : Tout s'arrête de suite, rien d'autre ne s'exécute. La mémoire n'est pas libérée, les mutex restent pris,... En général, si ton but n'est pas de quitter le programme juste après, tant pis pour toi.

    Après, il existe des fonction assassine qui au lieu d'y aller au bazooka utilise un poison lent, qui permet au thread en question de se rendre compte qu'il va mourir et de préparer sa succession (voire de prendre un antidote). Une possibilité pour ça est de générer une exception ou équivalent dans le thread en cours, ce signal remontant la pile d'appel et laissant donc un nettoyage se faire. La difficulté principale de cette méthode est de déterminer quand l'émission de cette exception peut se faire sans nuire au thread. Un problème connexe est qu'il est possible que le thread mettre très longtemps à mourir, voire refuse de le faire.
    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.

  3. #3
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Je ne connais pas KillThread() non plus, mais TerminateThread() correspond exactement à la description de JolyLoic.

    Cf les remarques de TerminateThread() si cette fonction t'intéresse.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Merci pour vos réponses.

    En fait c'est la fonction SDL_KillThread de SDL, en téléchargeant le source j'ai vu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* WARNING: This function is really a last resort.
     * Threads should be signaled and then exit by themselves.
     * TerminateThread() doesn't perform stack and DLL cleanup.
     */
    void SDL_SYS_KillThread(SDL_Thread *thread)
    {
    	TerminateThread(thread->handle, FALSE);
    }
    Voilà...
    En fait c'est TerminateThread, dans le lien donné par spoutspout il est dit:

    Citation Envoyé par MSDN
    TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code. DLLs attached to the thread are not notified that the thread is terminating. The system frees the thread's initial stack.
    Donc la pile est nettoyée, c'est déjà ça, mais je pense que je vais éviter au maximum de l'utiliser (juste un pointeur sur classe), quitte à faire un thread dans un autre pour gérer les mutex etc. proprement.

    Je n'ai pas très bien compris ce qui arrive avec les DLLs, est-ce que ça pose problème si j'utilise une fonction d'une DLL? Par exemple si j'utilise la fonction SDLNet_TCP_Send, qui est bloquante, et que je kill le thread, la fonction SDLNet_TCP_Send continuera de s'exécuter (car elle appartient à une DLL)??

    Je commence à avoir l'impression que je vais devoir totalement changer d'outils pour le réseau -- si les fonctions SDL Send et Recv peuvent bloquer longtemps -- car SDL_KillThread n'a pas l'air gentille du tout.

    Merci encore de votre aide,

    coyotte507

  5. #5
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Par exemple si j'utilise la fonction SDLNet_TCP_Send, qui est bloquante, et que je kill le thread, la fonction SDLNet_TCP_Send continuera de s'exécuter (car elle appartient à une DLL)??
    C'est exactement comme ça que je l'ai compris .
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Une fonction n'est pas un thread....

    Bloquant ca veut dire: "attend un signal d'un authre thread quelque part", c'est tout... si ton thread est dans la fonction SDLNet_TCP_Send, et que tu le tues, ben voilà, c'est tout, tu le tues... l'autre thread va bien envoyer son signal, mais y aura personne pour l'écouter.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    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
    Je ne connait pas SDL mais quelques idées pour ton problème:
    -> Plutôt que d'utiliser un brutal KillThread tu peux mettre en place un mécanisme de demande de fermeture de ton thred. Celui-ci peut alors se terminer correctement. A toi de gérer les blocages.
    -> Plutôt que d'avoir des TCPSDLNet_TCP_Send/Rcv en mode bloquant, tu peux t'appuyer sur des sockets non bloquantes et utiliser le select et/ou des API spécifiques pour attendre (type WSAWaitForMultipleEvents sur Windows).

  8. #8
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Une fonction n'est pas un thread....

    Bloquant ca veut dire: "attend un signal d'un authre thread quelque part", c'est tout... si ton thread est dans la fonction SDLNet_TCP_Send, et que tu le tues, ben voilà, c'est tout, tu le tues... l'autre thread va bien envoyer son signal, mais y aura personne pour l'écouter.
    Si c'est le thread qui appelle la fonction dans la DLL, (l'exécution se trouve alors dans la DLL) et que le thread appelant est killé pendant ce temps là, la DLL n'est pas tenue au courant de la mort du thread et continue jusqu'au retour de la fonction de la DLL utilisée je suppose.
    D'où le problème si la fonction est bloquante (sans parler du timeout).

    Car un EXE/DLL et une autre DLL sont tout de même des "composants" différents qui vivent leur vie chacun de leur côté.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  9. #9
    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
    Citation Envoyé par Spout Voir le message
    Si c'est le thread qui appelle la fonction dans la DLL, (l'exécution se trouve alors dans la DLL) et que le thread appelant est killé pendant ce temps là, la DLL n'est pas tenue au courant de la mort du thread et continue jusqu'au retour de la fonction de la DLL utilisée je suppose.
    D'où le problème si la fonction est bloquante (sans parler du timeout).

    Car un EXE/DLL et une autre DLL sont tout de même des "composants" différents qui vivent leur vie chacun de leur côté.
    Euh, t'es sûr de ça. Pour moi, le contexte d'exécution est lié à un processus avec ses threads. L'application et les DLL ne sont que du code chargé en mémoire. Si ton thread appelle une fonction dans une DLL, et que ton thread est tué, alors son exécution s'arrête même si le code en cours d'exécution était celui de la DLL. Le risque que je vois est plutôt lié à la non libération des ressources de ton thread.

  10. #10
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Euh, t'es sûr de ça.
    Pas complètement
    Citation Envoyé par 3DArchi Voir le message
    Pour moi, le contexte d'exécution est lié à un processus avec ses threads. L'application et les DLL ne sont que du code chargé en mémoire. Si ton thread appelle une fonction dans une DLL, et que ton thread est tué, alors son exécution s'arrête même si le code en cours d'exécution était celui de la DLL.
    Je comprends ce que tu veux dire, mais mon doute concerne les DLL avec leur propre classe applicative (par exemple CWinApp des MFC), pas celle qui n'exportent que des fonctions avec une interface C.
    Alors comment interprètes-tu ça:
    Citation Envoyé par MSDN
    DLLs attached to the thread are not notified that the thread is terminating.
    Citation Envoyé par 3DArchi Voir le message
    Le risque que je vois est plutôt lié à la non libération des ressources de ton thread.
    Egalement.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  11. #11
    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
    Citation Envoyé par Spout Voir le message
    Je comprends ce que tu veux dire, mais mon doute concerne les DLL avec leur propre classe applicative (par exemple CWinApp des MFC), pas celle qui n'exportent que des fonctions avec une interface C.
    A mon sens, il n'y a pas de création d'un nouveau process/thread donc l'exécution se poursuit dans le contexte actuel. Mais je vois ce que tu veux dire: CWinApp dérive de CWinThread-> donc création implicite d'un thread. En fait, il faut passer par CWinThread::CreateThread pour créer le thread, l'instanciation d'un CWinThread ne suffit pas. Et ça n'a pas l'air d'être le cas. Je ne suis pas sûr de mon coup, mais en croisant différentes infos du MSDN, je persiste à dire qu'il n'y a pas de création de thread implicite lors du chargement d'une quelconque DLL.

    Citation Envoyé par Spout Voir le message
    Alors comment interprètes-tu ça:
    Citation Envoyé par MSDN
    DLLs attached to the thread are not notified that the thread is terminating.
    Que tu ne passeras pas par ExitInstance/DllMain(DLL_THREAD_DETACH). Donc, tu auras bien un problème de libération de ressources.

  12. #12
    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
    Attention, "The system frees the thread's initial stack" signifie que la mémoire brute de la pile dudit thread est libérée. Aucun destructeur n'est appelé...
    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.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Un thread est un mécanisme de système d'exploitation pas de liaison direct avec le langage C++ qui lui ne permet pas la gestion des threads (nativement).

    En outre la seule façon (légale) d'appeler un destructeur est d'appeler un des deux opérateurs du langage C++, soit delete soit delete [] (si le ou les objets ont été crées avec "new").

    Il est donc très probable qu'une API type "KillThread" (que je ne connais pas d'ailleurs) n'appelle jamais un destructeur, et de toute façon si elle le faisait, le design de cette architecture serait très contestable.

    Dans la plupart des systèmes à base de threads, quand une de ces unités d'exécution est démarrée une pile est allouée (de taille déterminable en général). Quand le thread est détruit la pile est relachée.

  14. #14
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Bonsoir

    Citation Envoyé par Médinoc Voir le message
    Attention, "The system frees the thread's initial stack" signifie que la mémoire brute de la pile dudit thread est libérée. Aucun destructeur n'est appelé...
    C'est ce que j'avais compris aussi ...

    J'ai regardé la source de SDL_net (jusqu'où faut aller faire des vérifications!) et donc apparement les fonctions SDLNet_TCP_Send et SDLNet_TCP_Recv peuvent s'exécuter en un laps de temps assez court, quand on les appelle au bon moment, donc de ce côté là ça va... je les mettrais quand même dans un thread, mais j'aurais pas besoin de le tuer.

    J'ai compris les risques avec TerminateThread, la prudence exigée lorsqu'on l'utilise -- je ne connaissais pas les risques d'appeler une fonction DLL, et il n'y a pas de moyen de détacher une DLL d'un thread avec SDL uniquement (peut-être que sous linux y'a pas ce genre de problème ?).

    En gros, grâce à tous les renseignements obtenus, je pense avoir trouvé le moyen d'implémenter mon projet, sans changer de bibliothèque

    Merci beaucoup à vous tous!

    coyotte507

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Profman Voir le message
    En outre la seule façon (légale) d'appeler un destructeur est d'appeler un des deux opérateurs du langage C++, soit delete soit delete [] (si le ou les objets ont été crées avec "new").
    Depuis quand?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <string>
    #include <stdlib.h>
    #include <iostream>
    #include <ostream>
     
    using namespace std;
     
    int main()
    {
       void* ptr = malloc(sizeof(string));
       std::string* bar = new(ptr) string("Hello world\n");
       std::cout << *bar;
       bar->~string();
       free(ptr);
    }
    me semble parfaitement conforme, aux typos près. C'est la technique utilisée normalement dans les conteneurs (difficile par exemple d'implémenter std::vector<T>::reserve() si on ne n'utilise pas).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Depuis quand?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <string>
    #include <stdlib.h>
    #include <iostream>
    #include <ostream>
     
    using namespace std;
     
    int main()
    {
       void* ptr = malloc(sizeof(string));
       std::string* bar = new(ptr) string("Hello world\n");
       std::cout << *bar;
       bar->~string();
       free(ptr);
    }
    me semble parfaitement conforme, aux typos près. C'est la technique utilisée normalement dans les conteneurs (difficile par exemple d'implémenter std::vector<T>::reserve() si on ne n'utilise pas).
    La franchement c'est ce que j'appel de la grosse bidouille !!

    Appeler un destructeur "à la main", evidement on peut mais très dangereux dans un code pro.

    De plus je ne vois pas l'intérêt de ce code : allouer la taille de la string avec "malloc', appeler le destructeur explicitement et libérer avec "free" trop fort.

    Pourquoi ne pas utiliser que "new" et "delete" c'est fait pour ça : ça alloue et appel les bons mécanismes au bon moment.

  17. #17
    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
    Comme indiqué par Jean-Marc, c'est rare de devoir mettre ça en place, mais ça peut servir. Imagine par exemple qu'avec un seul malloc (ou un new "non typé") on peut réserver de la place contiguë pour 100 objets, mais ne créer qu'un objet dans un premier temps, puis créer les autres à la demande, sans plus avoir besoin d'allouer de mémoire. C'est ce que fait std::vector en interne.

    Il y a encore une autre façon légale d'appeler un destructeur, c'est certainement même la plus courante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    { 
     A a;
    } <- Le destructeur de A est appelé...
    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.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par JolyLoic Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    { 
     A a;
    } <- Le destructeur de A est appelé...
    Hehe oui c'est vrai La pile reste une valeur sûre.

    Un autre truc pas mal c'est d'utiliser un smart pointer qui se chargera de faire le delete. Mais c'est vrai que cette bête là ne plaît pas à tous

    Ici un exemple avec le smart pointer de boost :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class X;
    
    int main() {
    
        boost::scoped_ptr<X> spx( new X() );
    
        return 1;
    } // ici le destructeur de 'spx' entrainera la libération

  19. #19
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Comme indiqué par Jean-Marc, c'est rare de devoir mettre ça en place, mais ça peut servir. Imagine par exemple qu'avec un seul malloc (ou un new "non typé") on peut réserver de la place contiguë pour 100 objets, mais ne créer qu'un objet dans un premier temps, puis créer les autres à la demande, sans plus avoir besoin d'allouer de mémoire.
    Pratique très courante dans le développement de jeu vidéo par exemple, surtout sur console.

  20. #20
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Une surcharge de new et delete sera plus élégante dans une telle situation.

    Elle ppurra meme fournir des infos en mode debug.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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