_endthreadex (0) зависает - PullRequest
       5

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

2 голосов
/ 09 декабря 2008

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

Ответы [ 4 ]

9 голосов
/ 12 мая 2012

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

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

4 голосов
/ 09 декабря 2008

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

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

1 голос
/ 09 декабря 2008

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

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

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

0 голосов
/ 09 декабря 2008

Хорошо .... хорошо, endthreadex вызывается в деконструкторе моего класса через "delete classinstance" ... и этот вызов деконструктора никогда не возвращается ... так что все зависает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...