2008-12-09 94 views
2

我有一些代碼,我最初並沒有創建使用_beginthreadex和_endthreadex。出於某種原因,當它調用_endthreadex(0)時,調用只會掛起而不會返回。關於通常會導致此呼叫掛起的任何想法?_endthreadex(0)掛起

回答

4

_endthreadex結束線程,所以它不能返回。這就是調用它的關鍵。

編輯:調用_endthreadex有點不尋常,通常你只是讓線程啓動過程返回並且運行時爲你調用_endthreadex。您可能需要更多地解釋一下,在我們提供幫助之前,您正在嘗試做什麼。

0

好....好,endthreadex獲取通過「刪除Children子」 ......和析構函數調用不會返回......所以整個事情掛我的課的解構所謂

+0

什麼是掛?調用_endthreadex的線程不再執行,因此它不能執行掛起。 – 2008-12-09 15:27:31

+0

亞當你找到任何解決方案?我只是陷入了同樣的情況。從DLL中的靜態對象的dtors中銷燬線程是否正確? – StNickolay 2013-08-21 14:08:43

1

你誤打電話_endthreadex()嘗試從主線程結束一個線程?

函數_endthreadex()是爲了在要終止的線程中調用,以報告返回值,併爲適當的「爲線程分配的資源恢復」進行調用。你不需要在主線程的析構函數中調用它。您可以在析構函數中通過一個事件(參見SetEvent,從主線程調用)向線程發出信號,表示線程應儘快退出,然後以最後一條語句退出的線程將調用_endthreadex()

在你的主線程中調用_endthreadex()會導致進程掛起,因爲你已經終止了你的主線程,但是你仍然有你想要終止的原始線程仍在運行。

8

我的回答太晚了,但仍有人會使用它。

在我的情況下,_endthreadex在我卸載dll並刪除了一些全局對象時被絞死。全局對象之一有另一個線程內部,該線程也執行線程退出。由於DLLMain已經鎖定了crt內存映射,所以造成了死鎖。閱讀DLLMain幫助,並發現在DLLMain調用期間不允許對另一線程或進程執行任何其他操作。