又黄又www的网站_青青草.com_在线亚洲美日韩_九九九国产视频_√天堂8资源中文在线_一区二区三区免费网站_久久久久国产一区二区三区_人妻激情偷乱视频一区二区三区_一本到在线视频

DllMain和多線程死鎖

發布時間:2011-08-29 共3頁

  //創建DLL內的線程對象

  g_thread_handle = ::CreateThread(NULL,0,

  InSideDll_ThreadProc,(LPVOID)0,0,   &( g_thread_id) ) ;

  // 禁止線程庫調用,

  DisableThreadLibraryCalls((HINSTANCE)hModule);

  }

  break;

  case DLL_PROCESS_DETACH:

  // DLL正在從進程地址空間中卸載

  {

  //   通知內部的線程g_thread_handle 退出

  ::SetEvent(g_hEvent);

  //   等待內部的線程g_thread_handle 退出

  ::WaitForSingleObject(g_thread_handle, INFINITE ) ;

  // 清除資源

  ::CloseHandle(g_thread_handle);

  g_thread_id = 0 ;

  g_thread_handle = NULL ;

  ::CloseHandle(g_hEvent);

  g_hEvent=NULL;

  }

  break;

  }

  return TRUE;

  }

  //----------------------end   ------------

  上述代碼的流程是這樣的:

  (1)裝載DLL時,創建一個   DLL內部的線程g_thread_handle及事件對象g_hEvent,且線程g_thread_handle在事件對象g_hEvent上等待。

  (2)卸載DLL時,通過SetEvent(g_hEvent)通知線程g_thread_handle退出,隨即調用 WaitForSingleObject函數等待線程g_thread_handle終止運行。如果線程g_thread_handle終止運行,則執行清除工作。

  但是如果對這樣的程序進行調試,就會發現程序在退出時該DllMain沒有退出,等待了很長時間也沒有退出。

  查看了一下線程Call Stack窗口,注意到程序正在等待DllMain內部的線程g_thread_handle的退出。盡管線程g_thread_handle的線程函數已經返回了,但是整個g_thread_handle線程走到了操作系統的ntdll.dll中并沒有完全終止,從而導致整個DLL不能順利釋放。

  線程g_thread_handle為什么沒有完全退出呢?

  原來,線程函數返回時,系統并不立即將它撤消。相反,系統要取出這個即將被撤消的線程,讓它調用已經映射的DLL的所有帶有 DLL_THREAD_DETACH值的、且沒有調用DisableThreadLibraryCalls函數的DllMain函數。 DLL_THREAD_DETACH通知告訴所有的DLL執行每個線程的清除操作,例如,DLL版本的C/C++運行期庫能夠釋放它用于管理多線程應用程序的數據塊。DisableThreadLibraryCalls函數告訴系統說,特定的DLL的DllMain函數不用接收DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知。

  但是,系統是順序調用DLL的DllMain函數的。

  當線程函數返回時,系統檢查進程中是否存在沒有調用DisableThreadLibraryCalls函數的DllMain函數,如果存在,系統就以進程的互斥對象的句柄作為第一個參數,在線程內部調用WaitForSingleObject函數。一旦這個將要終止運行的線程擁有該進程互斥對象,系統就讓該線程用DLL_THREAD_DETACH的值依次調用每個沒有調用DisableThreadLibraryCalls函數的DLL的 DllMain函數。此后,系統才釋放對進程互斥對象的所有權。

  在本例所述的應用程序中,進程的退出引起操作系統獲取進程互斥對象使操作系統可以為DLL_PROCESS_DETACH通知調用 DllMain()。該DLL的DllMain()函數通知線程g_thread_handle終止運行。無論何時當進程終止一個線程時,操作系統將獲取進程互斥對象,以便于它可以為DLL_THREAD_DETACH通知調用每個加載的、沒有調用DisableThreadLibraryCalls函數的DLL的DllMain函數。在這個特定的程序中,線程g_thread_handle當線程函數返回后就阻塞了,因為CMySingleton的 DllMain()所處的線程還保持著進程互斥對象。不幸的是,DllMain所處的線程然后調用WaitForSingleObject確認 g_thread_handle線程是否完全終止。因為g_thread_handle線程被阻塞在進程互斥對象上,這個進程互斥對象還被DllMain 線程所持有, DllMain線程要等待g_thread_handle線程從而也被阻塞,結果就導致了死鎖。如下圖所示:

  注意,從圖2可以看出,如果當前進程中的所有 DLL都調用了DisableThreadLibraryCalls函數,那么上述代碼中的DLL也能正常退出。曾經寫過一個程序,除了加載一個這樣有問題的DLL沒有加載其他DLL(系統的DLL除外),程序能夠正常退出。

  3、結論

  很顯然的一個教訓就是在DllMain內部應該避免任何Wait*調用。但是進程互斥對象的問題不僅僅限于Wait*函數。操作系統在 CreateProcess、GetModuleFileName、GetProcAddress、wglMakeCurrent、 LoadLibrary和FreeLibrary等函數中在后臺獲取進程互斥對象,因此在DllMain中不應該調用任何這些函數。因為DllMain獲取進程互斥對象,所以一次只能有一個線程執行DllMain。

  ATL singleton的 FinalConstruct函數和FinalRelease函數分別是DllMain在響應DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH時被調用的,所以也要同樣注意本文所述的問題。

  編輯特別推薦:

  類成員函數的重載、覆蓋和隱藏的區別

  用C寫最簡單的Windows窗口程序:WINAPIHelloWorld

百分百考試網 考試寶典

立即免費試用
中文字幕在线久热精品| 天天躁日日躁成人字幕aⅴ| 国产成人精品一区二区三区免费| 国产在线观看91一区二区三区| 蜜芽一区二区三区| 精品久久久久久久久久久久久| 亚洲精品一区二区精华| 国产精品福利在线观看| 2018国产在线| 日本二区在线观看| 丰满熟妇乱又伦| 在线免费中文字幕| 高清不卡一区| 卡一卡二国产精品| 91国偷自产一区二区开放时间| 欧美插天视频在线播放| 亚洲欧美影院| 91导航在线观看| 伦理天堂电影| √天堂资源地址在线官网| 久久av国产紧身裤| 成人黄色小视频在线观看| 欧美日本免费一区二区三区| 国产99久久精品一区二区 夜夜躁日日躁 | 99a精品视频在线观看| 久久99热国产| 在线综合+亚洲+欧美中文字幕| 国产精品女视频| 亚洲制服中文字幕| 精品人妻一区二区三区麻豆91| 桃乃木香奈av在线| 九九视频精品全部免费播放| 亚洲国产成人一区二区三区| 中文字幕欧美日韩| 久久人妻无码一区二区| 九九热国产视频| 成年片费网站色大全免费视频| 成人亚洲网站| 成人国产电影网| 中文字幕亚洲图片| 日本aa在线观看| 国产午夜麻豆影院在线观看| 99精品久久久久| 久久久久亚洲av片无码v| 国产日韩欧美制服另类| 国产又粗又大又爽| 亚洲国产成人一区| 大黄网站在线观看| 免费在线黄色片| 999久久久| 久久久777精品电影网影网 | 黄色免费网站在线| 国产成人综合精品在线| 欧美在线二区| 成视频年人免费看黄网站| 波多野结衣先锋影音| 成人免费自拍视频| 欧美日韩一级视频| 成人精品亚洲人成在线| 亚洲男人天堂影院| 小毛片在线观看| 青青草成人在线| 麻豆精品在线观看| 美女高潮在线观看| 日本美女视频网站| 欧美孕妇与黑人孕交| 久久精品女人| 国产在线观看黄| 亚洲欧美日韩偷拍| 亚洲女同性videos| 欧美成人精品| 91福利免费在线| 国产无码精品在线播放| 免费激情视频在线观看| 亚洲美女av网站| 五月开心六月丁香综合色啪 | 欧美性老头oldtight| 可以看毛片的网址| 日韩欧美在线视频日韩欧美在线视频| 校园春色综合网| 香蕉成人app| 成人福利网站| 日韩毛片视频在线看| 国产秀色在线www免费观看| 亚洲国产精品久| 免费中文日韩| 日韩一区二区三区视频在线观看| 天天射—综合中文网| 91黄色在线视频| 91久久国产精品| 一区二区三区欧美久久| 中文字幕一区图| 成人免费视频77777| 亚洲欧美综合另类| 午夜在线观看av| 国产精品成av人在线视午夜片| 国产精品―色哟哟| 日韩欧美看国产| 天天草天天操| 日韩黄色三级视频| 国产二区国产一区在线观看| 免费永久视频| 怡红院亚洲色图| 色在人av网站天堂精品| 欧美偷拍一区二区| 国产厕所精品在线观看| 五月婷婷免费视频| 97香蕉碰碰人妻国产欧美| 亚洲一级片在线看| 成人深夜福利app| 欧美wwwwww| 老司机99精品99| 久久久久久无码精品人妻一区二区| 欧美大片在线观看一区| 粉嫩一区二区三区性色av| 欧美日韩在线观看不卡| 日韩国产成人在线| 91免费视频黄| 国产精品成人在线| 国产精品xxxx喷水欧美| 国产99久久久欧美黑人| 精品成人乱色一区二区| 日韩电影免费在线| 2020国产在线| 国产乱色精品成人免费视频| 嘿嘿视频在线观看| 欧美性受xxxx黑人猛交88| 99久久精品免费看国产一区二区三区| 欧美在线欧美在线| 久久99精品久久久久久园产越南| 日本在线观看| 另类春色校园亚洲| 亚洲mv在线看| 欧美性受xxxx| 99热在线精品观看| 偷拍自拍在线看| 免费超碰在线| 无线免费在线视频| 男人操女人免费网站| 白丝女仆被免费网站| 欧美日韩中文字幕在线播放| 成人黄在线观看| 欧美色网一区二区| 欧美aa国产视频| 香蕉久久99| 欧美日韩破处| 琪琪久久久久日韩精品| 欧美日日夜夜| 欧美理论电影大全| 精品一区二区免费视频| 蜜臀久久99精品久久久画质超高清| 欧美另类综合| 欧美黄色网视频| 久久99高清| 色是在线视频| 99色在线观看| 求av网址在线观看| 亚洲一区二区三区成人| xxxx影院| 亚洲人视频在线观看| a天堂中文字幕| 欧美午夜aaaaaa免费视频| 久久综合桃花网| 久久久久无码精品国产sm果冻| 亚洲天堂2018av| 日本手机在线视频| 成人精品视频在线播放| aa在线免费观看| 日韩少妇中文字幕| 亚洲国产成人久久综合一区| 欧美成人vr18sexvr| 欧美成人综合网站| 在线精品亚洲一区二区不卡| 亚洲二区中文字幕| 久久亚洲精品视频| 精品一区在线播放| 岛国大片在线播放| 这里只有久久精品| 全部毛片永久免费看| 国内自拍视频在线播放| 国产精品va无码一区二区三区| 成年人免费视频播放| 影音先锋亚洲天堂| 一级黄色a毛片| 中文字幕国语官网在线视频| 亚洲日本久久久午夜精品| 亚洲AV无码乱码国产精品牛牛| 波多野结衣电影在线播放| 96日本xxxxxⅹxxx17| 性欧美69式xxxxx| 在线观看视频污| 麻豆网在线观看| 传媒在线观看| 人人九九精品| 亚洲一区站长工具| 国产欧美日韩精品高清二区综合区| 日韩中字在线| 日韩电影在线观看完整免费观看| 成人三级视频| 蜜臀av一区二区三区|