Création d'un thread dans DllMain?
Il semble que lorsqu'un thread est créé à partir de l'intérieur de la fonction DllMain sur DLL_PROCESS_ATTACH
il ne commence pas jusqu'à ce que toutes les dll ont été chargés. Depuis que j'ai besoin pour vous assurer que le thread s'exécute avant de poursuivre, je reçois un blocage. Est-il un moyen de forcer le thread pour commencer?
OriginalL'auteur sold | 2009-11-06
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas faire des appels de l'API, en particulier pour des choses comme la création des threads ou windows, à partir de la fonction DLLMain. Raymond Chen a écrit à ce sujet de nombreuses fois; voici un c'est particulièrement pertinent.
Voigt, mais être très prudent, car il est facile d'obtenir de dead-lock si le courant DllMain appel est demandé d'attendre le retour de la nouvelle thread.
L'appel de fonctions wait dans
DllMain
est très mauvais, peu importe quel genre d'objet que vous êtes en attente pour les. Généralement, n'importe quel thread qui est l'exécution de code à partir d'une DLL doit avoir un compte de référence sur cette DLL, moins le code répertoriées sous. Qui empêche le problème de se produire, depuisDllMain
alors de ne pas être appelé processus de détacher) tant que le thread est en cours d'exécution.Bien que
CreateThread
peut être appelé en toute sécurité à partir deDllMain
(en supposant que vous êtes ok avec elle être suspendu et n'appelant pas tout attendre des fonctions), c'est toujours une mauvaise idée, précisément pour les raisons mentionnées dans son post de blog: si votre fichier DLL est brièvement chargés et déchargés par un autre dépendant de la DLL, vous ne voulez pas créer inutilement des ressources (comme les fils) dans ce scénario.Je crois que création d'un thread à partir de la fonction DllMain de blocage ou n'est-ce pas? est encore plus pertinent. Bottom line: Appel
CreateThread
deDllMain
est sûr (même si c'est pas recommandé).OriginalL'auteur Ken White
Quel est votre fils?
Si vous essayez de déplacer des trucs sur un deuxième thread pour éviter les restrictions sur ce que vous pouvez faire à l'intérieur de la fonction DllMain, pas de chance. Ceux ne sont pas des restrictions sur ce que DllMain pouvez le faire, ils font l'objet de restrictions sur ce qui peut être fait tout en fonction DllMain est en cours d'exécution (et détient le verrou du chargeur). Si votre fil doit prendre le verrou du chargeur, il faudra patienter jusqu'à ce que le premier thread a terminé de l'utiliser. Si votre fils n'avait pas besoin de le verrou du chargeur, je ne vois pas pourquoi il ne pourrait pas continuer immédiatement... mais il n'y a pas une telle chose comme un fil qui n'a pas besoin de le verrou du chargeur. Windows a envoyer DLL_THREAD_ATTACH des messages à toutes les Dll avant votre thread peut commencer à courir, ce qui signifie qu'il appelle également votre propre DllMain, et Windows protège contre la ré-entrancy.
Il n'y a pas moyen de contourner cela. Le thread ne peut débuter qu'après DLL_THREAD_ATTACH de traitement, et qui ne peut pas se produire lors de votre premier thread est à l'intérieur de la fonction DllMain. La seule façon de contourner cela est de lancer un nouveau processus (qui est un organe indépendant verrou du chargeur et ne bloquera pas d'attente pour le vôtre).
CreateThread()
pour une très simple travailleur de la fonction dans unDLLMain()
lors du traitement d'unDLL_PROCESS_ATTACH
messages. La fonction de thread utiliséSleep()
pour 1000 millisecondes. Tout a bien fonctionné. Je pouvais voir laDLL_THREAD_ATTACH
messages etDLL_THREAD_DETACH
les messages provenant à la fois le thread initial de faire leDLL_PROCESS_ATTACH
et le thread créé pendant l'attachement de traitement. Cependant, ce thread n'a rien d'autre que leSleep()
. Kernel32.dll les appels sont censée être bonne. Testé avec VS 2005 Windows 7.Curieusement, c'est vraiment la seule réponse qui répond à la question qui a été posée. Je ne sais pas pourquoi l'OP a décidé d'accepter une réponse qui ne l'est pas.
OriginalL'auteur Ben Voigt
Pas. Vous ne devez pas appeler CreateThread (ou tout varation) à partir de la fonction DllMain. De tenter de synchroniser entraînera dans une impasse. Qu'est-ce exactement que vous essayez de faire?
Les meilleures Pratiques pour la Création de Dll
OriginalL'auteur lyricat
Vous êtes d'avoir des ennuis si vous faites cela. Vous ne devriez pas faire des appels (directement ou indirectement) à des fonctions qui sont à l'extérieur de votre dll (y compris la bibliothèque C d'appels, etc.).
Si vous ne pouvez pas modifier la DLL que vous avez (par exemple, vous n'avez pas le code source), vous pourrait être en mesure de s'en tirer avec cela, si votre DLL est chargée dynamiquement après le reste de votre charge de DLL sont initialisés. Je ne recommande pas cette méthode si vous pouvez l'éviter en raison de déterminer la dépendance de la chaîne n'est pas toujours trivial (par exemple, si votre fichier dll causes charge la dll à charger un tiers de façon dynamique par le biais de COM ou d'autres moyens).
blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx
Grâce Entier Poète. Qui répond exactement à la question, je suis venu ici à résoudre.
Les deux kernel32.dll et ntdll.dll sont garantis pour être mappé dans un espace d'adressage du processus avant son amorçage code s'exécute.
OriginalL'auteur Peter Tate