Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > WaitForSingleObject


Автор: ASMatic 9.1.2010, 18:44
Есть поток, который создает множество потоков и записывает их хендлы в список.
другой поток в цикле перебирает список и когда в списке есть хендл он пытается дождатся его завершения...Некоторые потоки(большинство) завершаются и обрабатываются нормально. Но некоторые остаются в "неопознаном" состоянии. В менеджере потоков в VisualStudio "висят" интересующие меня потоки. Но location у них странный,т.е. я не знаючто это значит:

 0        0x0000146c    Worker Thread     TestThread    _unlock_fhandle    Normal    0

на этот момент в списке хендлы есть и WaitForSingleObject возвращает WAIT_TIMEOUT ну а если переключится на поток 0x0000146с - висит на  выходе! с ф-ии  _unlock_fhandle, т.е. на самой фигурной дужке....

Чем может быть вызвано такое поведение?

Автор: Earnest 9.1.2010, 18:46
Так может потоки сами по себе завершаться не хотят? Каждый поток должен сам свою функцию потока завершить. Ждет их кто-то или нет- им по барабану.

Автор: ASMatic 9.1.2010, 18:52
хммм, вроде как должны выходить, но идея! буду смотреть в ту сторону. Просто смущает его текущая локация, еще и неизвесная)

Автор: GremlinProg 9.1.2010, 20:35
Цитата(ASMatic @  9.1.2010,  20:44 Найти цитируемый пост)
висит на  выходе! с ф-ии  _unlock_fhandle, т.е. на самой фигурной дужке....

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

посмотри стек вызовов(call stack), который привел этот поток к _unlock_fhandle,
получишь команду, которая действительно не дает завершиться потоку,
это или функция ожидания, или цикл какой-нить

Автор: ASMatic 9.1.2010, 22:43
Earnest, я как бы и сам понимал, но в случае что все ветви работают по одному коду и по всех ветвлениях выводят логи совсем не подозревал что где то может быть маленькая и незаметная getchar(^), которую я еще когда не пользовал многопоточность поставил для теста ну и естественно она была именно там где раже всего бывает eip. 
GremlinProg, да! Вы правы, это та команда которая будет следущая при получении управления потоком) Со стеком - первая мысль была такой, но студия показывала много чего : ntdll!0x..... kernel32!0x.... но вот о getchar() - ни байта. Поэтому решено было по совету Earnest пересмотреть код более тщательно и особо придать внимания циклам.

Спасибо всем, задача решена!

п.с. мож кто знает как в студию, для дебага подключить символы какой нить либы?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)