_endthreadex (0) зависание

голоса
2

У меня есть некоторый код, который я первоначально не создать что использует _beginthreadex и _endthreadex. По какой-то причине, когда он называет _endthreadex (0), вызов просто висит и никогда не возвращается. Любые идеи относительно того, что обычно вызывает бы этот призыв повесить?

Задан 09/12/2008 в 16:05
источник пользователем
На других языках...                            


4 ответов

голоса
4

_endthreadex заканчивается нить, поэтому он не может вернуться. Вот весь смысл называть его.

EDIT: Это немного непривычно называть _endthreadex, как правило, вы просто дайте процедуру возврата резьб и выполнения вызовов _endthreadex для вас. Вам может понадобиться, чтобы объяснить немного больше, что вы пытаетесь сделать, прежде чем мы можем помочь.

Ответил 09/12/2008 в 16:14
источник пользователем

голоса
0

Хорошо .... ну endthreadex вызывается в Разрушитель моего класса с помощью «удалить classinstance» ... и что Разрушитель вызов никогда не возвращается ... так что все виснет

Ответил 09/12/2008 в 16:18
источник пользователем

голоса
1

Вы ошибочно называя _endthreadex () , чтобы попытаться закончить нить от основного потока?

Функция _endthreadex () предназначена называться внутри потока , который вы хотите завершить , чтобы сообщить возвращаемое значение, и для правильного «восстановления ресурсов , выделяемых на волоске» . Вы не должны вызывать его в деструкторе от основного потока. Вы могли бы, в деструкторе, сигнал к потоку через событие (см SetEvent , вызывается из основного потока) , что поток должен выйти как можно скорее, а затем поток , который покидает в своем последнем заявлении назвал бы _endthreadex () ,

Вызов _endthreadex () в основном потоке вызовет процесс повесить, потому что вы прекращен ваш основной поток, но вы по- прежнему иметь оригинальную нить вы хотели прекратить все еще работают.

Ответил 09/12/2008 в 16:54
источник пользователем

голоса
9

Мой ответ на это слишком поздно, но все-таки кто-то будет использовать его.

В моем случае _endthreadex повешен, когда я выгружать DLL и удалены некоторые глобальные объекты. Одна из глобальных объектов был еще один поток внутри и что нить также осуществляется выход резьбы. Это вызвало затор, поскольку DllMain карта уже заблокирована элт памяти. Читайте DLLMain помощь и найти, что вы не можете делать какие-либо другие действия на других потоков или процессов во время DLLMain вызова.

Ответил 11/05/2012 в 21:10
источник пользователем

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