在DllMain中创建一个线程?

时间:2009-11-06 15:22:59

标签: winapi dll multithreading

似乎当在DLL_PROCESS_ATTACH上从DllMain内创建一个线程时,它将不会开始,直到所有dll都被加载。因为我需要在继续之前确保线程运行,所以我遇到了僵局。有没有办法强制线程启动?

4 个答案:

答案 0 :(得分:10)

您不应该从DLLMain执行任何API调用,尤其是对于创建线程或窗口等内容。 Raymond Chen多次写过这篇文章;这里one特别相关。

答案 1 :(得分:5)

你的主题是做什么的?

如果你想把东西转移到第二个线程上以避免限制你在DllMain中可以做什么,那就太难了。这些不是对DllMain可以做什么的限制,它们是对DllMain运行时可以做什么的限制(并且保持加载器锁定)。如果你的线程需要加载加载器锁,它将等到第一个线程完成使用它。如果你的线程不需要加载器锁,我不明白为什么它不能立即继续......但是没有一个不需要加载器锁的线程。 Windows必须在您的线程开始运行之前向所有DLL发送DLL_THREAD_ATTACH消息,这意味着它还会调用您自己的DllMain,并且Windows可以防止重新入侵。

没有办法解决这个问题。线程无法在DLL_THREAD_ATTACH处理之后启动,并且当您的第一个线程在DllMain内时不会发生。唯一可行的方法是启动一个新进程(它有一个独立的加载器锁定,不会阻止等待你的进程)。

答案 2 :(得分:4)

没有。你不应该从DllMain调用CreateThread(或任何变种)。尝试同步将导致死锁。你究竟想做什么?

Best Practices for Creating DLLs

答案 3 :(得分:0)

如果你这样做,你会遇到麻烦。你不应该(直接或间接)调用你的dll之外的函数(包括C库调用等)。

如果您无法更改您拥有的DLL(例如,您没有源代码),那么如果您的DLL在其余部分之后动态加载,则可能能够侥幸成功您的依赖DLL已初始化。我不推荐这种方法,如果你可以避免它,因为找出依赖链并不总是微不足道的(例如,如果你的dll导致依赖的dll通过COM或其他方式动态加载第三个)。