首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

有关dllmain中进程退出时的有关问题

2012-04-03 
有关dllmain中进程退出时的问题我想让一个.exe的应用程序在结束之前调用dllmain中DLL_PROCESS_DETACH分支

有关dllmain中进程退出时的问题

我想让一个.exe的应用程序在结束之前调用dllmain中DLL_PROCESS_DETACH分支中的一个线程函数,如下:

 DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)  
{  
  if (dwReason == DLL_PROCESS_ATTACH)  
hThreadHandle = (HANDLE)_beginthreadex(NULL, 0, &ThreadFun,
  NULL, 0, &threadid);  
 if(WaitForSingleObject(hThreadHandle,INFINITE)==WAIT_O_OBJECT) //运行到此处就死住了,根本到不了线程函数
  CloseHandle(hThreadHandle);  
 }  
unsigned _stdcall ThreadFun(void *param)
{
printf("MyNewThread Is Begin");
return 0;
}
哪位高手能帮我解决一下,谢谢!

[解决办法]

探讨
那如果我需要在dllmain()中调用线程函数怎么办呢,有什么好办法解决呢?

[解决办法]
14 楼的方法好像不行啊 
创建进程的时候,系统建立了一个互斥对象.每个进程都有自己的互斥对象,映射到DllMain时,互斥对象会合一个进程所有线程同步。
调用CreateThread时,系统首次创建线程内核对象。然后你调用
WaitForSingleObject传递互斥句柄,有了互斥对象系统又会调用每个Dll的DLL_THREAD_ATTACH,这时系统才会调用ReleaseMutex撤销互斥对象所有权。所以DisableThreadLibraryCalls()不能阻止死锁。你只能想办法不要调用WaitForSingleObject一系列函数才行。


[解决办法]
from 《windows 核心编程》:
通过进一步的研究,我终于发现了问题。当进程被创建时,系统也创建一个互斥对象。每个进程都有它自己的互斥对象,也就是说多个进程并不共享互斥对象。当线程调用映射到进程的地址空间中的D L L的D l l M a i n函数时,这个互斥对象负责对进程的所有线程实施同步。
当C r e a t e T h r e a d函数被调用时,系统首先创建线程的内核对象和线程的堆栈。然后它在内部调用Wa i t F o r S i n g l e O b j e c t函数,传递进程的互斥对象的句柄。一旦新线程拥有该互斥对象,系统就让新线程用D L L _ T H R E A D _ AT TA C H的值调用每个D L L的D l l M a i n函数。只有在这个时候,系统才调用R e l e a s e M u t e x,释放对进程的互斥对象的所有权。由于系统采用这种方式来运行,因此添加对D i s a b l e T h r e a d L i b r a r y C a l l s的调用,并不会防止线程被暂停运行。防止线程被暂停运行的唯一办法是重新设计这部分源代码,使得Wa i t F o r S i n g l e O b j e c t不会在任何D L L的D l l M a i n函数中被调用。

对于DLL_PROCESS_DETACH同样适用.
所以不要在DLL_PROCESS_DETACH中等待线程

重新设计你的线程吧

热点排行