2 回答

TA貢獻1827條經驗 獲得超8個贊
這樣解釋或許你更能明白:
創建線程會調用應用程序已經加載的所有DLL的DLLMain(參見DLLMain的文檔中關于reason參數的說明),而DLLMain是不可以重入的,所以應用程序會死鎖。
也就是:BOOL CGameDllApp::InitInstance()在你的DLL的DLLMain中被調用,而你此時又創建線程,就會再次想調用你的DLL的DLLMain,但是CGameDllApp::InitInstance()所在的DLLMain并未執行完。所以就得等待完成,所以就AfxbeginThread等待自己完成操作,卡在這里了。

TA貢獻1784條經驗 獲得超7個贊
系統是順序調用D L L的D l l M a i n函數的。為了理解這樣做的意義,可以考慮下面這樣一個環境。假設一個進程有兩個線程,線程A和線程B。該進程還有一個D L L,稱為S o m e D L L . d l l,它被映射到了它的地址空間中。兩個線程都準備調用C r e a t e T h r e a d函數,以便再創建兩個線程,即線程C和線程D。
當線程A調用C r e a t e T h r e a d來創建線程C時,系統調用帶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函數。當線程C執行D l l M a i n函數中的代碼時,線程B調用C r e a t e T h r e a d函數來創建線程D。這時系統必須再次調用帶有D L L _ T H R E A D _ AT TA C H值的D l l M a i n函數,這次是讓線程D 執行代碼。但是,系統是順序調用D l l M a i n函數的,因此系統會暫停線程D的運行,直到線程C完成對D l l M a i
n函數中的代碼的處理并且返回為止。
當線程C完成D l l M a i n的處理后,它就開始執行它的線程函數。這時系統喚醒線程D,讓它處理D l l M a i n中的代碼。當它返回時,線程D開始處理它的線程函數。
AfxBeginThread的核心還是CreateThread函數。
所以請將AfxBeginThread函數從InitInstance里面拿出來,在導出個其他函數進行AfxBeginThread調用吧。
- 2 回答
- 0 關注
- 141 瀏覽
添加回答
舉報