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

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>
            欧美精品一区二区高清在线观看| aa级大片欧美三级| 香蕉成人伊视频在线观看| 亚洲国产三级| 麻豆成人综合网| 美日韩免费视频| 欧美激情a∨在线视频播放| 欧美a级片网站| 欧美激情1区| 亚洲免费观看视频| 99re热这里只有精品视频| 一区二区三区黄色| 亚洲午夜久久久久久久久电影院| 在线性视频日韩欧美| 亚洲一区二区在线| 欧美亚洲系列| 欧美 日韩 国产 一区| 欧美激情中文字幕一区二区| 欧美日韩国产首页| 国产亚洲精品福利| 亚洲第一区中文99精品| 亚洲毛片播放| 久久国产精品99精品国产| 亚洲欧美另类国产| 在线高清一区| 亚洲美女尤物影院| 中文亚洲免费| 久久久精品日韩| 亚洲精品久久视频| 午夜精品视频| 欧美不卡一卡二卡免费版| 国产精品99免视看9| 精品成人免费| 亚洲在线一区二区| 老司机久久99久久精品播放免费 | 欧美在线亚洲一区| 欧美成人嫩草网站| 亚洲一区免费网站| 欧美福利一区| 国产在线观看91精品一区| 一区二区三区精品视频| 久久深夜福利免费观看| 在线视频精品一区| 欧美精品导航| 尤物yw午夜国产精品视频| 欧美一区二区三区四区在线 | 欧美成人精品一区| 欧美一级精品大片| 欧美日韩国产一级片| 在线观看av一区| 久久大逼视频| 亚洲一区欧美| 欧美色偷偷大香| 亚洲美女黄色片| 欧美成人午夜影院| 久久精品国产一区二区三| 国产精品午夜av在线| 一区二区三区高清在线观看| 欧美大胆人体视频| 久久精品夜色噜噜亚洲aⅴ | 日韩视频中文字幕| 女同一区二区| 久久人人精品| 一区在线免费| 免费看亚洲片| 麻豆成人综合网| 亚洲大胆人体在线| 欧美h视频在线| 久久人人精品| 亚洲精品久久久一区二区三区| 牛牛国产精品| 宅男噜噜噜66一区二区66| 欧美国产综合视频| 久久综合久久久久88| 精品91视频| 欧美成人精品在线| 欧美成人首页| 亚洲视频网在线直播| 欧美在线三级| 欧美国产三区| 亚洲午夜精品网| 亚洲午夜一区二区三区| 国产精品久久久久久久9999| 亚洲欧美激情视频| 亚洲一区在线视频| 国内精品久久久久久久影视蜜臀 | 欧美国产精品| 正在播放欧美视频| 一区二区三区精密机械公司 | 国产精品美女久久福利网站| 欧美一区二区高清在线观看| 欧美一级片久久久久久久| 国产一区二区三区在线免费观看 | 欧美另类videos死尸| 亚洲一级在线| 欧美有码在线视频| 99成人在线| 久久国产欧美精品| 中国成人在线视频| 久久免费视频一区| 中文高清一区| 久久亚洲精品一区二区| 亚洲一区在线播放| 乱码第一页成人| 欧美一区二区性| 欧美黄色免费| 久久嫩草精品久久久精品一 | 亚洲精品自在久久| 亚洲在线日韩| 亚洲精品字幕| 久久先锋影音| 久久久久久久综合色一本| 欧美日韩免费网站| 欧美成人xxx| 国产综合久久| 亚洲欧美国产不卡| 亚洲一区二区三区成人在线视频精品| 久久婷婷麻豆| 久久久噜噜噜久久| 国产精品网曝门| 91久久精品国产91久久性色| 国产日韩欧美精品| 亚洲国产一区二区精品专区| 欧美日韩综合视频网址| 欧美刺激性大交免费视频| 欧美日韩一区在线观看| 久久精品国产亚洲a| 一区二区三区 在线观看视频| 亚洲破处大片| 亚洲女与黑人做爰| 亚洲免费高清视频| 欧美一级免费视频| 欧美高清视频在线播放| 国产精品国产三级国产| 久久久久亚洲综合| 欧美激情在线狂野欧美精品| 欧美电影专区| 国产视频综合在线| 日韩午夜激情av| 日韩午夜av| 久久综合999| 亚洲福利视频网站| 国产日韩欧美在线播放| 亚洲国产天堂久久国产91| 国产亚洲综合性久久久影院| 欧美一区二区网站| 亚洲专区一区| 欧美日韩 国产精品| 免费亚洲电影在线| 国产一区在线观看视频| 久久精品国产亚洲aⅴ| 亚洲女人av| 欧美性色综合| 一个色综合av| 在线成人欧美| 欧美日韩p片| 亚洲三级免费电影| 亚洲精品免费在线播放| 在线视频中文亚洲| 久久久国产午夜精品| 国产欧美欧洲在线观看| 这里只有精品丝袜| 亚洲网站啪啪| 国产亚洲va综合人人澡精品| 亚洲曰本av电影| 欧美在线日韩精品| 国产女优一区| 蜜桃久久av| 亚洲精品国产品国语在线app| 亚洲第一精品夜夜躁人人躁| 久久米奇亚洲| aa级大片欧美| 亚洲欧美成人一区二区在线电影| 欧美美女bb生活片| 99精品国产99久久久久久福利| 性欧美xxxx视频在线观看| 国产精品久久久久9999| 亚洲天堂成人在线观看| 精品白丝av| 国产精品九九| 亚洲欧美日韩直播| 久久一本综合频道| 国产精品激情av在线播放| 久久久久久久久久久一区| 美女日韩欧美| 日韩一级黄色片| 一区二区亚洲精品| 欧美不卡高清| 一区二区三区久久久| 午夜亚洲视频| 亚洲美女av网站| 国产精品福利在线观看网址| 午夜精品www| 美女视频一区免费观看| 在线电影院国产精品| 国产欧美精品一区aⅴ影院| 久久久久.com| 夜夜嗨网站十八久久| 久久久久久久综合狠狠综合| 在线观看一区欧美|