_endthreadex (0) zawiesza

głosy
2

Mam kod, który nie pierwotnie stworzyć który wykorzystuje _beginthreadex i _endthreadex. Z jakiegoś powodu, gdy wywołuje _endthreadex (0), wywołanie tylko wisi i nigdy nie wraca. Wszelkie pomysły, co zwykle powoduje to wezwanie do powieszenia?

Utwórz 09/12/2008 o 16:05
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
4

_endthreadex końce nici, tak więc nie można przywrócić. To cały punkt nazywając ją.

EDIT: To trochę nietypowe zadzwonić _endthreadex, zwykle po prostu pozwolić procedury powrotu początek gwintu i środowisko wykonawcze wywołuje _endthreadex dla Ciebie. Być może trzeba wyjaśnić nieco więcej, co staramy się robić, zanim będziemy mogli pomóc.

Odpowiedział 09/12/2008 o 16:14
źródło użytkownik

głosy
0

Ok .... dobrze, endthreadex jest wywoływana w Deconstructor mojej klasie poprzez „delete classinstance” ... i że wezwanie Deconstructor nigdy nie powraca ... więc cały zawiesza Rzecz

Odpowiedział 09/12/2008 o 16:18
źródło użytkownik

głosy
1

Czy błędnie nazywając _endthreadex () próbować zakończyć wątek z głównego wątku?

Funkcja _endthreadex () ma być nazywane wewnątrz wątku, który chcesz rozwiązać zgłosić wartości zwracanej, a do prawidłowego „odzyskania środków przeznaczonych na gwincie.” Nie ma potrzeby, aby zadzwonić go w destructor od głównego wątku. Można, w destructor, sygnał do wątku poprzez zdarzenia (patrz SetEvent , wywoływana z głównego wątku), że wątek powinien wyjść jak najszybciej, a następnie wątek, który wystaje w swoim ostatnim oświadczeniu nazwałbym _endthreadex () ,

Wywołanie _endthreadex () w głównym wątku spowodowałoby proces powiesić, bo już zakończone głównego wątku, ale wciąż masz oryginalny wątek którą chciałeś zakończyć jeszcze uruchomiony.

Odpowiedział 09/12/2008 o 16:54
źródło użytkownik

głosy
9

Moja odpowiedź jest zbyt późno, ale nadal ktoś będzie go używać.

W moim przypadku _endthreadex powieszono kiedy rozładować dll i usunięte kilka obiektów globalnych. Jednym z obiektów globalnych miał inny wątek wewnątrz i że wątek wykonywane również wyjście gwintu. To spowodowało impas od DllMain już zablokowany pamięci crt mapie. Czytaj DllMain pomocy i stwierdzą, że nie wolno wykonywać żadnych innych czynności na kolejnych wątków lub procesów podczas DllMain rozmowy.

Odpowiedział 11/05/2012 o 21:10
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more