在DllMain中创建一个线程?

sol*_*old 10 dll winapi multithreading

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

Ken*_*ite 10

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

  • CreateThread是你在DllMain中可以做的少数事情之一,因为它是对kernel32的调用,保证已经加载. (10认同)
  • @Ben Voigt但要非常小心,因为如果要求当前的DllMain调用等待从新线程返回,则很容易死锁. (2认同)
  • @BenVoigt:虽然可以从`DllMain`安全地调用`CreateThread`(假设你没有被挂起而没有调用任何等待函数),但这仍然是一个坏主意,正是出于Raymond博客文章中提到的原因:if您的DLL被其他一些依赖DLL短暂加载和卸载,您不希望在该场景中创建不必要的资源(如线程). (2认同)
  • 我相信 [是否从 DllMain 死锁创建线程?](https://blogs.msdn.microsoft.com/oldnewthing/20070904-00/?p=25283/) 更相关。底线:从 `DllMain` 调用 `CreateThread` 是安全的(即使不推荐)。 (2认同)

Ben*_*igt 6

你的主题是做什么的?

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

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