2 回答
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
這樣解釋或許你更能明白:
創(chuàng)建線程會(huì)調(diào)用應(yīng)用程序已經(jīng)加載的所有DLL的DLLMain(參見(jiàn)DLLMain的文檔中關(guān)于reason參數(shù)的說(shuō)明),而DLLMain是不可以重入的,所以應(yīng)用程序會(huì)死鎖。
也就是:BOOL CGameDllApp::InitInstance()在你的DLL的DLLMain中被調(diào)用,而你此時(shí)又創(chuàng)建線程,就會(huì)再次想調(diào)用你的DLL的DLLMain,但是CGameDllApp::InitInstance()所在的DLLMain并未執(zhí)行完。所以就得等待完成,所以就AfxbeginThread等待自己完成操作,卡在這里了。
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊
系統(tǒng)是順序調(diào)用D L L的D l l M a i n函數(shù)的。為了理解這樣做的意義,可以考慮下面這樣一個(gè)環(huán)境。假設(shè)一個(gè)進(jìn)程有兩個(gè)線程,線程A和線程B。該進(jìn)程還有一個(gè)D L L,稱(chēng)為S o m e D L L . d l l,它被映射到了它的地址空間中。兩個(gè)線程都準(zhǔn)備調(diào)用C r e a t e T h r e a d函數(shù),以便再創(chuàng)建兩個(gè)線程,即線程C和線程D。
當(dāng)線程A調(diào)用C r e a t e T h r e a d來(lái)創(chuàng)建線程C時(shí),系統(tǒng)調(diào)用帶D L L _ T H R E A D _ AT TA C H值的S o m e D L L . d l l的D l l M a i n函數(shù)。當(dāng)線程C執(zhí)行D l l M a i n函數(shù)中的代碼時(shí),線程B調(diào)用C r e a t e T h r e a d函數(shù)來(lái)創(chuàng)建線程D。這時(shí)系統(tǒng)必須再次調(diào)用帶有D L L _ T H R E A D _ AT TA C H值的D l l M a i n函數(shù),這次是讓線程D 執(zhí)行代碼。但是,系統(tǒng)是順序調(diào)用D l l M a i n函數(shù)的,因此系統(tǒng)會(huì)暫停線程D的運(yùn)行,直到線程C完成對(duì)D l l M a i
n函數(shù)中的代碼的處理并且返回為止。
當(dāng)線程C完成D l l M a i n的處理后,它就開(kāi)始執(zhí)行它的線程函數(shù)。這時(shí)系統(tǒng)喚醒線程D,讓它處理D l l M a i n中的代碼。當(dāng)它返回時(shí),線程D開(kāi)始處理它的線程函數(shù)。
AfxBeginThread的核心還是CreateThread函數(shù)。
所以請(qǐng)將AfxBeginThread函數(shù)從InitInstance里面拿出來(lái),在導(dǎo)出個(gè)其他函數(shù)進(jìn)行AfxBeginThread調(diào)用吧。
- 2 回答
- 0 關(guān)注
- 174 瀏覽
添加回答
舉報(bào)
