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

Windows Discussion :

Aide : DLL & Process_Detach & _beginthread


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Aide : DLL & Process_Detach & _beginthread
    Bonjour,

    J'ai un problème concernant la destruction de thread a l'intérieur d'un DLL. Voici la situation.
    Il y a une DLL qui crée ses propres Thread (_beginthread). Lorsque l'application quitte, Process_Detach est appellé dans le DLLMain. A ce moment, je tente de tuer les Threads par suicide (c'est a dire, qu'un état est envoyé au Thread et que ce dernier interrompt son activité et se detruit).
    Hors, il semble que lorsque Process_Detach est appellé, l'ensemble des Threads gèle et par conséquent, la mécanique de suicide ne fonctionne pas.

    Savez vous pourquoi les Threads semblent gèler lors de la libération de la DLL ?

    Merci beaucoup de votre aide.
    sébastien

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Quote de Raymond Chen :

    This deadlock is much more commonly seen in DLL_PROCESS_DETACH, where a DLL wants to shut down its worker threads and wait for them to clean up before it unloads itself. You can't wait for a thread inside DLL_PROCESS_DETACH because that thread needs to send out the DLL_THREAD_DETACH notifications before it exits, which it can't do until your DLL_PROCESS_DETACH handler returns.

    (It is for this thread cleanup case that the function FreeLibraryAndExitThread was created.)
    Quote de la remarque de FreeLibraryAndExitThread :

    The FreeLibraryAndExitThread function allows threads that are executing within a DLL to safely free the DLL in which they are executing and terminate themselves. If they were to call FreeLibrary and ExitThread separately, a race condition would exist. The library could be unloaded before ExitThread is called.
    Il suffit donc de gérer correctement (avec FreeLibraryAndExitThread donc) le déchargement de la DLL créatrice des threads secondaires.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 414
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 414
    Points : 20 566
    Points
    20 566
    Par défaut
    Tout cela me semble bien compliqué et alambiqué.
    Un thread doit toujours se terminer par lui-même c'est ce qu'il ya de plus conseillé.
    Tu dois envoyer un message WM_USER ( avec SendMessge ) au thread et celui-ci doit le traiter et doit détecter ce WM_USER.
    Et pas ce genre bricolage dont tu parles

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Merci
    Merci beaucoup de votre aide.
    Bonne fin de journée

  5. #5
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Citation Envoyé par Mat.M Voir le message
    Tout cela me semble bien compliqué et alambiqué.
    Un thread doit toujours se terminer par lui-même c'est ce qu'il ya de plus conseillé.
    Tu dois envoyer un message WM_USER ( avec SendMessge ) au thread et celui-ci doit le traiter et doit détecter ce WM_USER.
    Et pas ce genre bricolage dont tu parles
    Je ne suis pas d'accord Mat.M.
    On peut très bien imaginer un "worker thread" (thread de travail) qui attend soit un évènement - au sens Win32 de EVENT - particulier pour traiter quelque chose, soit un moment particulier pour entrer en jeu. Dans ces deux cas le thread boucle indéfiniment en attente de quelque chose à faire (thread "d'écoute").

    Le problème auquel semble faire face le P.O est que si la DLL vient à être déchargée, il veut mettre fin proprement à ses threads - je suppose, pour éviter une possibilité de Race condition -, ce qui n'est pas possible (condition de deadlock) au moment du traitement de DLL_PROCESS_DETACH dans DllMain.

    De plus les worker threads n'ont pas de pompe à message - puisque pas de fenêtre attachée - donc ils ne reçoivent aucun message window (WM_xxx).

    En tout cas c'est ce qu'il me semble avoir compris du problème original, mais je peux me tromper.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut DLL Thread
    Effectivement, c'est un peu cela. Les threads crées a l'intérieur de la DLL boucle infiniement (évidement) a chaque 20 ms vérifient l'état d'une boolèenne. Si cette booléenne est vraie, ils se suicident.
    Cette variable est mise a vraie (demande de suicide de thread) lors de l'appelle a DLLMain et PROCESS_DETACH.

    Hors, a cette étape, les threads ne semblent plus fonctionner et donc ne se suicident pas.
    Les réponses ci-dessus semblent être un bon début de réponse a ma question.

    Merci

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 414
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 414
    Points : 20 566
    Points
    20 566
    Par défaut
    Citation Envoyé par SebROLLE Voir le message
    Si cette booléenne est vraie, ils se suicident.
    Cette variable est mise a vraie (demande de suicide de thread) lors de l'appelle a DLLMain et PROCESS_DETACH.
    A ce moment-là c'est un problème d'accès aux variables et moins d'exécution de thread.
    D'après ce que je comprends ce booléen n'est pas ou mal verrouillé, plusieurs processus y accèdent.
    Il faut utiliser des sections critiques et verrouiller le booléen le cas échéant avec EnterCriticalSection et LeaveCriticalSection

+ Répondre à la discussion
Cette discussion est résolue.

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