dllmain和多线程死锁

dllmain和多线程死锁

ID:15486139

大小:45.50 KB

页数:8页

时间:2018-08-03

dllmain和多线程死锁_第1页
dllmain和多线程死锁_第2页
dllmain和多线程死锁_第3页
dllmain和多线程死锁_第4页
dllmain和多线程死锁_第5页
资源描述:

《dllmain和多线程死锁》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、DllMain和多线程死锁在Windows操作系统中,DLL(动态链接库)技术有很多优点。例如,多个应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,有效地利用了内存,而且DLL文件作为一个单独的程序模块,封装性、独立性好,有利于提高软件开发和维护的效率。  DllMain是可选择的DLL入口指针,当进程和线程启动和终止时被系统调用,分别进行创建资源和释放资源等操作,特别地,也可以在DLL被装载进进程空间时(即DllMain响应DLL_PROCESS_ATTACH通知时)创建线程,在DLL从进程空间卸载时(即DllMain响应DLL_PROCESS_D

2、ETACH通知时)结束线程。但是,在DllMain中无论是创建线程还是结束线程,都特别要注意一个规则,那就是DllMain的顺序调用规则。  1、DllMain的顺序调用规则  Windows操作系统中是顺序调用DLL的入口函数DllMain的。当进程被创建时,系统也为该进程创建了一个互斥对象。每个进程都有它自己的互斥对象。进程互斥对象的一个作用是,序列化在需要调用DllMain的4种情况下DllMain的执行:DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH和DLL_PROCESS_DETACHDLL。DllMain函数的第二

3、个参数指示出调用DllMain的原因。  在DllMain中创建线程或终止线程时,如果违背了DllMain的这个顺序调用规则,程序就会发生死锁。下面就DllMain中创建线程和终止线程两种情况下的死锁分别进行讲述。  2、DllMain中创建和终止线程时的死锁  2.1、装载DLL时创建的线程的为什么没有运行  考虑在一个多线程程序中,某个DLL被加载进程地址空间时,该DLL的DllMain启动了一个线程,然后立即调用一个应答事件对象的WaitForSingleObject函数,以确认在继续进行其余的DllMain处理之前,新产生的线程能够正确地执行一些操作。类似的代码如下:  //--

4、--------------------start  ------------  HANDLE      g_thread_handle=NULL;      //该DLL内部线程的句柄  DWORD      g_thread_id=0;      //该DLL内部线程的ID  HANDLEg_hEvent=NULL;//应答事件的句柄  DWORDWINAPIInSideDll_ThreadProc(LPVOIDp)  {  /*表示一些操作。  如果“----operations.----”被打印到Output窗口中了,  说明本线程函数在被执行了。*/  OutputDebugS

5、tring(“----operations.----”);  /*  InSideDll_ThreadProc的操作完成后,  通知在g_hEvent处等待的线程,可以继续运行了。*/  SetEvent(g_hEvent);  return  1;  }  BOOLAPIENTRYDllMain(HANDLEhModule,  DWORD  ul_reason_for_call,LPVOIDlpReserved)  {  switch(ul_reason_for_call)  {  caseDLL_PROCESS_ATTACH:  //DLL正在映射到进程地址空间中  {  //禁

6、止线程库调用,  DisableThreadLibraryCalls((HINSTANCE)hModule);  //创建DLL内线程使用的事件对象  g_hEvent=::CreateEvent(NULL,FALSE,FALSE,_T("hello11"));  //创建DLL内线程对象  g_thread_handle=::CreateThread(NULL,0,  InSideDll_ThreadProc,(LPVOID)0,0,  &(g_thread_id));  //等待刚创建的线程完成相关操作  ::WaitForSingleObject(g_hEvent,INFINITE

7、); //清除资源  ::CloseHandle(g_thread_handle);  g_thread_id=0;  g_thread_handle=NULL;  ::CloseHandle(g_hEvent);  g_hEvent=NULL;  }  break;  caseDLL_PROCESS_DETACH:  //DLL正在从进程地址空间中卸载  break;  }  returnTRUE;  }  //---------

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。