Multithreading 线程的WaitForSingleObject在从应用程序全局调用时冻结

Multithreading 线程的WaitForSingleObject在从应用程序全局调用时冻结,multithreading,winapi,waitforsingleobject,Multithreading,Winapi,Waitforsingleobject,我创建了一个线程作为某个池的一部分,当应用程序(DLL)实际完成时需要销毁该线程。所以我有一些“globals”,意思是一个静态全局实例化的结构,在析构函数中它释放所有创建的线程,并使用WaitForSingleObject等待它们。不幸的是,这将永远冻结,并且检入调试器会发现线程仍然存在,只是卡在系统DLL中的某个地方。当我在globals被释放之前打电话时,一切都会好起来。我在Win32文档中没有看到任何提及这一点的内容。有什么想法吗?所以解决方案确实是避免等待,并且实际上在DllMain(

我创建了一个线程作为某个池的一部分,当应用程序(DLL)实际完成时需要销毁该线程。所以我有一些“globals”,意思是一个静态全局实例化的结构,在析构函数中它释放所有创建的线程,并使用WaitForSingleObject等待它们。不幸的是,这将永远冻结,并且检入调试器会发现线程仍然存在,只是卡在系统DLL中的某个地方。当我在globals被释放之前打电话时,一切都会好起来。我在Win32文档中没有看到任何提及这一点的内容。有什么想法吗?

所以解决方案确实是避免等待,并且实际上在DllMain(包括globals)中发布任何不好的东西,因此需要在发布之前发布所有重要的东西。这有时有点棘手,当涉及到dll时,但是…

析构函数是从dll入口点调用的,位于加载程序锁关键部分内。线程,在退出之前,请尝试进入此关键部分,以便发送
DLL\u线程\u分离
。但是不能,因为它由调用
WaitForSingleObject
的线程持有。所以线程不能退出,直到
WaitForSingleObject
不退出,但是
WaitForSingleObject
可以退出,直到线程不退出。真的,你不需要等待。从dll创建线程时,需要对dll进行ad引用。线程必须通过调用
freelLibraryAndExitThread退出。等待线程退出不需要-为了什么?!你只需要信号线程就可以退出,你已经这样做了,我是如何理解的是的,在这种情况下不需要它,所以我通过取消等待来解决它,但我不明白为什么。看起来线程无法完成,它们不需要等待任何东西。但我只是解释一下为什么是死锁。确保您了解全局构造函数和析构函数何时运行。我很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。