我的线程A正在创建另一个线程B,而不是线程A使用WaitforsingleObject等待等待直到线程B死亡。

问题在于,即使线程B从线程的“ thread_func”返回,线程A 不会发出信号!.

我知道,因为我在thread_func(线程B的主函数)的末端添加了轨迹(outputDebugstring),并且我可以看到线程B完成了其执行,但是Thread A永远不会从Waitforsingleobject中出现。

现在,我还必须补充说,此代码在com对象中,并且当我调用regsvr32.exe(它被卡住!)时,上述场景正在发生,所以我相信线程A来自dllmain。

有什么想法为什么线程A不会发出信号?!?!

有帮助吗?

解决方案

您可能会遇到装载机锁的问题。 Windows,有一个内部关键部分,每当dll加载/卸载或启动/停止线程时,该部分就会锁定(dllmain始终在该锁定内部调用DLLMAIN)。如果您的等待线程A的关键部分已锁定(即您正在等待Dllmain的某个地方),而另一个线程B试图关闭并尝试获取该装载机关键部分,则您的僵局。

要查看僵局发生的位置,只需从VS IDE调试器运行您的应用程序,然后陷入困境后,请断开执行。然后查看所有运行线程,并记下每个线程的堆栈。您应该能够跟随每个堆栈,看看每个线程在等待什么。

其他提示

我认为@dxm是对的。关于您可以或无法在内部做什么的文档 DllMain 稀疏且难以找到,但最重要的是,您通常应该将其保持在最低限度 - 初始化内部变量等等,但仅此而已。

我要说的另一点是你一般应该 不是 “呼叫” regsvr32.exe-

Regsvr32基本上只是一个包装器,它将DLL加载到其地址空间中 LoadLibrary, ,电话 GetProcAddress 获取名称的函数的地址 DllRegisterServer, ,然后调用该功能。这样的工作要干净很多(最终,更容易),这样的事情是这样的:

HMODULE mod = LoadLibrary(your_COM_file); 
register_DLL = GetProcAddress(mod, "DllRegisterServer"); 
if ( register_DLL == NULL) { 
        // must not really be a COM object... 
} 

if ( S_OK != register_DLL()) { 
        // registration failed. 
} 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top