设为首页 加入收藏

TOP

DllMain和多线程死锁
2014-11-23 20:29:12 】 浏览:10003
Tags:DllMain 线程

  在Windows操作系统中,DLL(动态链接库)技术有很多优点。例如,多个应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,有效地利用了内存,而且DLL文件作为一个单独的程序模块,封装性、独立性好,有利于提高软件开发和维护的效率。


  DllMain是可选择的DLL入口指针,当进程和线程启动和终止时被系统调用,分别进行创建资源和释放资源等操作,特别地,也可以在DLL被装载进进程空间时(即DllMain响应DLL_PROCESS_ATTACH通知时)创建线程,在DLL从进程空间卸载时(即DllMain响应 DLL_PROCESS_DETACH通知时)结束线程。但是,在DllMain中无论是创建线程还是结束线程,都特别要注意一个规则,那就是 DllMain的顺序调用规则。


  1、DllMain的顺序调用规则


  Windows操作系统中是顺序调用DLL的入口函数DllMain的。当进程被创建时,系统也为该进程创建了一个互斥对象。每个进程都有它自己的互斥对象。进程互斥对象的一个作用是,序列化在需要调用DllMain的 4种情况下DllMain的执行:DLL_PROCESS_ATTACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH和 DLL_PROCESS_DETACHDLL。DllMain函数的第二个参数指示出调用DllMain的原因。


  在DllMain中创建线程或终止线程时,如果违背了DllMain的这个顺序调用规则,程序就会发生死锁。下面就DllMain中创建线程和终止线程两种情况下的死锁分别进行讲述。


  2、DllMain中创建和终止线程时的死锁


  2.1、装载DLL时创建的线程的为什么没有运行


  考虑在一个多线程程序中,某个DLL被加载进程地址空间时,该DLL的DllMain启动了一个线程,然后立即调用一个应答事件对象的 WaitForSingleObject函数,以确认在继续进行其余的DllMain处理之前,新产生的线程能够正确地执行一些操作。类似的代码如下:


  //----------------------start ------------


  HANDLE g_thread_handle =NULL; // 该DLL内部线程的句柄


  DWORD g_thread_id =0; // 该DLL内部线程的ID


  HANDLE g_hEvent=NULL;// 应答事件的句柄


  DWORD WINAPI InSideDll_ThreadProc( LPVOID p )


  {


  /* 表示一些操作。


  如果“---- operations.----”被打印到Output窗口中了,


  说明本线程函数在被执行了。 */


  OutputDebugString(“---- operations.---- \n”);


  /* InSideDll_ThreadProc的操作完成后,


  通知在g_hEvent处等待的线程,可以继续运行了。*/


  SetEvent(g_hEvent);


  return 1;


  }


  BOOL APIENTRY DllMain( HANDLE hModule,


  DWORD ul_reason_for_call, LPVOID lpReserved )


  {


  switch (ul_reason_for_call)


  {


  case DLL_PROCESS_ATTACH:


  //DLL正在映射到进程地址空间中


  {


  // 禁止线程库调用,


  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 );



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇通过ini实现多语言菜单 下一篇2007年9月计算机等级考试二级C模..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目