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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
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) 的常見(jiàn)做法是:在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)存泄漏。 接下來(lái)做2個(gè)簡(jiǎn)單實(shí)驗(yàn)說(shuō)明這個(gè)問(wèn)題。

實(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)生的線程并沒(méi)有調(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ⅴ成人免费视频| 一区二区三区四区五区精品| 亚洲国产中文字幕在线观看| 欧美一级大片在线免费观看| 亚洲夫妻自拍| 国产精品一区二区三区观看| 午夜精品久久久久久久99樱桃| 女主播福利一区| 国产麻豆成人精品| 日韩午夜剧场| 日韩一级欧洲| 欧美1区2区3区| 国产欧美va欧美va香蕉在| 一区二区三区成人| 亚洲美女精品久久| 另类尿喷潮videofree| 久久综合久久综合这里只有精品 | 欧美成人蜜桃| 国产香蕉97碰碰久久人人| 制服诱惑一区二区| 欧美精品在线一区二区| 亚洲国产综合在线看不卡| 在线看不卡av| 久久久久久尹人网香蕉| 欧美+日本+国产+在线a∨观看| 国产乱人伦精品一区二区| 亚洲男人的天堂在线观看| 亚洲女女女同性video| 国产在线视频不卡二| 欧美日韩国产综合视频在线观看| 美女视频黄免费的久久| 免费亚洲婷婷| 午夜视频在线观看一区| 国产精品v欧美精品∨日韩| 亚洲日本一区二区| 国产精品大片| 亚洲影视在线| 久久9热精品视频| 国产日本欧美一区二区三区| 亚洲在线免费| 亚洲黄色尤物视频| 欧美aⅴ一区二区三区视频| 亚洲电影免费在线观看| 亚洲欧洲一区二区三区久久| 欧美—级在线免费片| 亚洲精品自在在线观看| 亚洲一区二区三区午夜| 国产精品自拍视频| 老司机精品视频网站| 亚洲经典在线| 羞羞视频在线观看欧美| 国产在线成人| 欧美激情精品久久久六区热门 | 久久综合久久综合九色| 欧美专区日韩专区| 国产又爽又黄的激情精品视频| 久久久精彩视频| 亚洲精品黄色| 久久精品人人做人人爽| 日韩视频在线永久播放| 国产亚洲一区二区三区在线观看 | 欧美日韩国产系列| 午夜一区不卡| 亚洲日本欧美日韩高观看| 欧美一区二区三区男人的天堂| 伊人婷婷欧美激情| 国产精品www.| 亚洲一区二区三区高清 | 快she精品国产999| 亚洲伊人第一页| 亚洲高清自拍| 国产视频在线观看一区| 欧美日韩在线视频一区| 久久深夜福利| 性xx色xx综合久久久xx| 99在线热播精品免费99热| 欧美成人精品高清在线播放| 欧美专区日韩专区| 亚洲一区免费观看| 这里只有精品丝袜| 亚洲国产精品久久久久秋霞影院| 国产日韩视频| 国产精品色午夜在线观看| 欧美日韩国产999| 蜜臀99久久精品久久久久久软件| 欧美伊人精品成人久久综合97| 亚洲视频狠狠| 99re视频这里只有精品| 亚洲激情在线激情| 欧美大尺度在线| 老鸭窝91久久精品色噜噜导演| 小辣椒精品导航| 亚洲精品欧美精品| 亚洲国产精品激情在线观看| 一区在线视频| 激情欧美一区二区三区在线观看| 国产麻豆日韩欧美久久| 国产精品乱码一区二区三区| 久久久久久高潮国产精品视| 欧美在线不卡| 久久精品视频在线观看| 欧美在线欧美在线| 久久高清福利视频| 久久久久久久999精品视频| 久久成人免费电影| 久久精品一级爱片| 久久久亚洲午夜电影| 久久综合五月| 欧美韩日精品| 欧美日韩在线不卡一区| 国产精品国产三级国产aⅴ无密码| 欧美色区777第一页| 国产精品久久久久久久久借妻| 国产精品日本欧美一区二区三区| 国产精品久久久久9999高清| 国产美女高潮久久白浆| 国产一区二区成人久久免费影院| 国产一区在线看| 亚洲福利在线观看| 亚洲精选一区二区| 亚洲小视频在线| 欧美怡红院视频| 久久午夜色播影院免费高清| 亚洲国产一二三| 中文在线不卡视频| 亚洲七七久久综合桃花剧情介绍| 日韩一级不卡| 欧美在线地址| 欧美黄网免费在线观看| 亚洲美女福利视频网站| 亚洲欧美国产日韩中文字幕| 一区二区三区四区五区精品视频 | 久久精品人人做人人综合| 亚洲影音先锋| 久久久青草婷婷精品综合日韩| 国产日韩欧美电影在线观看| 国产模特精品视频久久久久| 好男人免费精品视频| 欧美日韩在线视频一区二区| 欧美日韩国产123| 国产乱理伦片在线观看夜一区 | 久久爱另类一区二区小说| 久久夜色精品国产欧美乱极品| 欧美久久久久久| 国产乱码精品1区2区3区| 亚洲第一精品在线| 亚洲午夜免费视频| 久久免费偷拍视频| 亚洲精品一区二区三区福利| 亚洲欧美日韩一区二区三区在线观看 | 欧美成在线视频| 一区二区欧美在线观看| 久久国产精品久久久久久电车| 欧美大片一区| 国产日韩一区二区| 亚洲精选视频免费看| 久久国产欧美精品| 亚洲看片一区| 久久手机免费观看| 久久一区精品| 国产欧美一区视频| 99在线精品观看| 美女主播视频一区| 亚洲欧美日韩国产一区二区三区| 欧美91视频| 欧美韩日一区二区| 激情综合久久| 欧美一区日韩一区| 日韩一区二区电影网| 久久这里有精品视频| 国产毛片久久| 亚洲午夜精品一区二区| 欧美成人激情视频免费观看| 午夜精品成人在线视频| 欧美日韩精品一区二区在线播放| 在线观看国产精品淫| 香蕉乱码成人久久天堂爱免费| 亚洲人成网站999久久久综合| 久久精品国产欧美亚洲人人爽| 国产精品国产精品| 一区二区三欧美| 亚洲电影免费观看高清完整版在线观看 | 久久久久在线观看| 99re6热只有精品免费观看 | 亚洲视频网站在线观看| 欧美激情亚洲激情| 久久精精品视频| 国产精品久久九九| 亚洲狠狠婷婷| 久久综合久久88| 亚洲专区一区二区三区| 欧美精品在线视频| 一本色道久久综合精品竹菊| 蜜桃av综合|