青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

DLL_THREAD_DETACH 認(rèn)識(shí)誤區(qū)

Posted on 2010-02-07 17:18 S.l.e!ep.¢% 閱讀(923) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
DLL_THREAD_DETACH 認(rèn)識(shí)誤區(qū)
2009-06-01 22:20

轉(zhuǎn)自:CSDN 微軟 陳本峰 http://blog.csdn.net/WinGeek/

文章鏈接:http://blog.csdn.net/WinGeek/archive/2009/06/01/4230741.aspx

DLL 里面使用TLS (Local Thread Storage) 的常見做法是:在DLLMain的DLL_PROCESS_ATTACH/DLL_THREAD_ATTACH 被調(diào)用的時(shí)候?yàn)槊總€(gè)線程(Thread)分配內(nèi)存,而在DLL_THREAD_DETACH/DLL_PROCESS_DETACH 被調(diào)用的時(shí)候釋放內(nèi)存。 MSDN文章《Using Thread Local Storage in a Dynamic-Link Library》 上有這樣的示例代碼。

BOOL WINAPI DllMain(HINSTANCE hinstDLL, // DLL module handle
??? DWORD fdwReason,??????????????????? // reason called
??? LPVOID lpvReserved)???????????????? // reserved
{
??? LPVOID lpvData;
??? BOOL fIgnore;

??? switch (fdwReason)
??? {
??????? case DLL_PROCESS_ATTACH:
??????????? // Allocate a TLS index.
??????????? if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)??????????????? return FALSE;
???????? case DLL_THREAD_ATTACH:
???????????? lpvData = (LPVOID) LocalAlloc(LPTR, 256); //為每個(gè)Thread分配內(nèi)存
??????????? if (lpvData != NULL)
??????????????? fIgnore = TlsSetValue(dwTlsIndex, lpvData);
??????????? break;
???????? case DLL_THREAD_DETACH:
???????????? lpvData = TlsGetValue(dwTlsIndex);
??????????? if (lpvData != NULL)
??????????????? LocalFree((HLOCAL) lpvData); //釋放內(nèi)存
??????????? break;
???????? case DLL_PROCESS_DETACH:
??????????? lpvData = TlsGetValue(dwTlsIndex);
??????????? if (lpvData != NULL)
??????????????? LocalFree((HLOCAL) lpvData); //釋放內(nèi)存
??????????? TlsFree(dwTlsIndex);
??????????? break;
???????? default:
??????????? break;
??? }
???? return TRUE;
}


這段代碼認(rèn)為DLL_THREAD_DETACH 總是會(huì)被調(diào)用, 但實(shí)際情況并非如此。在某些情況下DLL_THREAD_DETACH并不會(huì)被調(diào)用, 結(jié)果造成內(nèi)存泄漏。 接下來做2個(gè)簡單實(shí)驗(yàn)說明這個(gè)問題。

實(shí)驗(yàn)代碼:

typedef void (__stdcall *FNSLEEP)();

void CallTestDLL()
{
??? FNSLEEP pfnSleep = (FNSLEEP)::GetProcAddress(g_hDLLModule, "DoSleep");
??? ATLASSERT(pfnSleep);
??? (*pfnSleep)();
}

DWORD WINAPI ThreadProc( LPVOID lpParam)
{
??? CallTestDLL();
??? return 0;
}??

g_hDLLModule = ::LoadLibrary(_T("TestDLL.dll"));
ATLTRACE("[Thread %d] LoadLibrary=0x%.8x\n", ::GetCurrentThreadId());
CallTestDLL();
const int MAX_THREAD = 2;
HANDLE hThread[MAX_THREAD];
for (int i=0; i < MAX_THREAD; i++)
{
?? hThread[i] = ::CreateThread(NULL, 0, ThreadProc, 0, 0, NULL);
}
Sleep(MAX_THREAD * 1000);
::FreeLibrary(g_hDLLModule);

輸出結(jié)果1:

[Thread 4976] DLL_PROCESS_ATTACH??????????????? //主線程
[Thread 4976] LoadLibrary=0x0ecbf9d4
[Thread 4976] DoSleep() in DLL
[Thread 7860] DLL_THREAD_ATTACH????????????????? //CreateThread 產(chǎn)生的線程
[Thread 736] DLL_THREAD_ATTACH??????????????????? //CreateThread 產(chǎn)生的線程
[Thread 736] DoSleep() in DLL
[Thread 7860] DoSleep() in DLL
[Thread 736] DLL_THREAD_DETACH
[Thread 7860] DLL_THREAD_DETACH
[Thread 4976] DLL_PROCESS_DETACH??????????????? //主線程

以上輸入結(jié)果我們看到每個(gè)Thread 調(diào)用DLL函數(shù)DoSleep 立即結(jié)束,這時(shí)候DLL_THREAD_DETACH 被正常調(diào)用。 這時(shí)只要候稍微改一下代碼,會(huì)看到完全不同的結(jié)果。

DWORD WINAPI ThreadProc( LPVOID lpParam)
{
??? CallTestDLL();

??? DoSomethingElse(); // 延遲線程結(jié)束
??? return 0;
}??


輸出結(jié)果2:


[Thread 7448] DLL_PROCESS_ATTACH????????????? //主線程
[Thread 7448] LoadLibrary=0x0b1cf9d4
[Thread 7448] DoSleep() in DLL
[Thread 6872] DLL_THREAD_ATTACH
[Thread 6556] DLL_THREAD_ATTACH
[Thread 6556] DoSleep() in DLL
[Thread 6872] DoSleep() in DLL
[Thread 7448] DLL_PROCESS_DETACH???????????? //主線程


我們發(fā)現(xiàn),CreateThread 產(chǎn)生的線程并沒有調(diào)用DLL_THREAD_DETACH 。

結(jié)論:

如果是線程在DLL被卸載(調(diào)用FreeLibrary) 之前結(jié)束,則DLL_THREAD_DETACH 會(huì)被調(diào)用。 如果線程在DLL卸載之后結(jié)束,則DLL_THREAD_DETACH 不會(huì)被調(diào)用。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲无人区一区| 激情欧美国产欧美| 一区二区91| 亚洲国产另类久久久精品极度| aⅴ色国产欧美| 亚洲视频免费在线| 亚洲夜晚福利在线观看| 一本不卡影院| 久久国内精品视频| 免费亚洲一区二区| 免费看成人av| 免费国产自线拍一欧美视频| 欧美久久电影| 国产精品国产三级国产aⅴ9色| 欧美日韩精品免费观看视一区二区| 欧美午夜免费影院| 国产午夜精品美女视频明星a级| 国产日产亚洲精品| 一区二区在线观看视频在线观看| 影音先锋日韩精品| 亚洲毛片在线看| 香蕉久久国产| 亚洲片在线资源| 9久re热视频在线精品| 一本一本久久a久久精品综合麻豆| 亚洲毛片播放| 亚洲字幕一区二区| 久久精品一级爱片| 欧美成人免费播放| 99这里只有精品| 先锋影音久久久| 亚洲视频免费| 欧美专区中文字幕| 欧美另类视频在线| 国产精品中文字幕欧美| 国产日韩欧美中文| 99视频精品全部免费在线| 香蕉久久夜色| 欧美激情第3页| 99热在这里有精品免费| 欧美一区日本一区韩国一区| 久久一区二区三区四区| 久久精品九九| 欧美日韩 国产精品| 国产一区在线看| 亚洲最新在线| 另类成人小视频在线| 日韩一级黄色av| 久久久亚洲精品一区二区三区 | 亚洲欧洲日韩综合二区| 亚洲欧美日本在线| 欧美成人性网| 亚洲一区二区黄| 欧美视频一区二区三区在线观看| 亚洲三级性片| 亚洲精品在线免费| 美女精品一区| 国产深夜精品| 亚洲一区免费| 日韩视频不卡| 欧美在线国产精品| 欧美三区在线观看| 亚洲国产成人一区| 欧美亚洲免费在线| 一本色道久久加勒比精品| 亚洲欧美另类久久久精品2019| 欧美精品国产一区| 亚洲精品乱码久久久久久| 久久久久高清| 国产精品99久久久久久有的能看| 欧美成人午夜剧场免费观看| 亚洲第一精品在线| 久久婷婷丁香| 久久精品2019中文字幕| 国产欧美一区二区三区另类精品 | 久久99在线观看| 欧美激情第六页| 亚洲国产经典视频| 免费黄网站欧美| 另类天堂av| 亚洲欧洲精品一区二区精品久久久| 麻豆成人综合网| 久久久久久久久久久一区| 亚洲精品综合久久中文字幕| 一区二区三区高清在线观看| 国产亚洲在线观看| 亚洲国产日韩精品| 国产伦精品一区二区三区免费| 美女精品在线观看| 欧美母乳在线| 久久久午夜精品| 欧美天天在线| 欧美成人激情视频免费观看| 欧美午夜精品久久久久久孕妇| 久久久久www| 欧美丝袜一区二区三区| 免费看成人av| 国产精品自在欧美一区| 亚洲区一区二| 好看不卡的中文字幕| 99精品免费| 亚洲精品影院| 久久精品国产久精国产一老狼| 99亚洲视频| 久久久久久久久岛国免费| 亚洲在线成人精品| 欧美成年人视频网站| 久久国产精品一区二区| 欧美另类人妖| 亚洲国产精品成人| 在线观看日韩欧美| 亚洲欧美文学| 亚洲欧美日韩综合| 欧美日韩精品综合| 亚洲电影欧美电影有声小说| 韩日午夜在线资源一区二区| 亚洲女ⅴideoshd黑人| 亚洲制服av| 欧美天天影院| 亚洲香蕉成视频在线观看| 一本久道久久综合婷婷鲸鱼| 免费精品99久久国产综合精品| 久久综合狠狠综合久久综青草| 国产精品午夜在线| 亚洲——在线| 欧美一区二区私人影院日本| 国产精品美女久久久久久2018| 亚洲激情在线| 99综合视频| 欧美色视频日本高清在线观看| 99精品国产在热久久| 亚洲一区三区电影在线观看| 欧美日韩国产限制| 在线视频你懂得一区| 亚洲欧美日韩综合国产aⅴ| 国产精品久久久久久久久免费桃花 | 久久乐国产精品| 国产精品igao视频网网址不卡日韩 | 性欧美video另类hd性玩具| 国产精品福利网| 亚洲主播在线观看| 久久国产精品黑丝| 国产色产综合产在线视频| 欧美一区综合| 欧美成va人片在线观看| 在线观看国产成人av片| 久久综合中文字幕| 91久久极品少妇xxxxⅹ软件| 夜夜嗨av一区二区三区网站四季av| 欧美日韩情趣电影| 亚洲午夜久久久| 久久最新视频| 日韩视频免费观看高清完整版| 欧美丝袜第一区| 久久精品视频在线免费观看| 久久综合久久久| 亚洲精品乱码久久久久久蜜桃91| 欧美区高清在线| 亚洲男人的天堂在线观看| 欧美不卡视频一区| 亚洲先锋成人| 狠狠综合久久av一区二区小说| 欧美成年人视频网站| 亚洲一区二区免费在线| 欧美69wwwcom| 亚洲女同同性videoxma| 亚洲大片在线| 国产精品香蕉在线观看| 美女黄毛**国产精品啪啪| 亚洲视频第一页| 欧美激情第4页| 久久精品欧洲| 亚洲视频综合在线| 亚洲电影观看| 国产精品视频免费一区| 欧美不卡视频一区发布| 欧美一区二区观看视频| 亚洲精品一二| 美女啪啪无遮挡免费久久网站| 一区二区欧美亚洲| 亚洲福利小视频| 国产精品一区二区黑丝| 欧美激情久久久久| 久久aⅴ国产欧美74aaa| 亚洲视频成人| 亚洲精品视频免费观看| 蜜臀久久久99精品久久久久久| 亚洲图片你懂的| 亚洲七七久久综合桃花剧情介绍| 国产视频一区三区| 国产精品系列在线播放| 欧美性事在线| 欧美精品色一区二区三区| 久久精品亚洲一区二区三区浴池| 亚洲午夜精品一区二区三区他趣| 一本到12不卡视频在线dvd| 亚洲精品国产欧美| 亚洲激情欧美激情| 欧美黄色一区| 欧美高清不卡|