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


Автор: Stormeg 2.7.2009, 00:16
В DLL_PROCESS_ATTACH создаеться поток. На момент DLL_PROCESS_DETACH созданный поток уже не существует, некорректно завершен (убит) системой.
Как обойти данную ситуацию и самому позаботиться о завершении потока? Возможно как-то определить до события DLL_PROCESS_DETACH, что у системы есть намерения выгрузить данную DLL? DLL выгружаеться только в случае завершения программы. (Программа не знает о существовании DLL)
(http://forum.vingrad.ru/topic-177439.html)

Автор: DrHex 2.7.2009, 01:02
Система постарается(и у ней получится) убить поток, при выгрузки библиотеки, связано это с тем что поток может выполнять код в адресном пространстве процесса отведенного для этой библиотеки, да и в конце концов память потока(стек ну и че нибудь еще) хранится та в dll, а память надо освободить значит и прихлопним поток.

Можно вам посоветовать поставить хук на выгрузу библиотеки, но сново таки разве это решение проблемы? Разве что как временное....


А вообще в динамических библиотеках создавать поток, это не самое хорогое решение. Разве что если библиотека живет все время выполнения процесса.

Хотелось бы узнать как происходит взаимодействие между библиотекой и процессом который использует библиотеку.

Автор: Stormeg 2.7.2009, 01:33
Цитата(DrHex @  2.7.2009,  01:02 Найти цитируемый пост)
Хотелось бы узнать как происходит взаимодействие между библиотекой и процессом который использует библиотеку.

DLL заставляет процесс вызывать пару API-функций через себя. Поток в DLL - синхронная прослушка именованного канал, на другой стороне которого висит управляющий работой DLL сторонний процесс. Как вариант  локального решения проблемы можно попробовать изменить организацию общения с управляющим процессом, хм.. 
Убиение потока не приводит ни к чему критическому в работе программ. Но хочеться все сделать правильно.

Автор: Lazin 2.7.2009, 06:00
Цитата(DrHex @  2.7.2009,  01:02 Найти цитируемый пост)
Можно вам посоветовать поставить хук на выгрузу библиотеки, но сново таки разве это решение проблемы? Разве что как временное....

ага, и код хука будет то-же находится в dll smile
Stormeg, можешь начинать думать о том, как переписать свой код так, что-бы поток не нужно было завершать, или переписать библиотеку так, что-бы у нее была ф-я a-la Finalize, но тогда программа должна будет знать о существовании dll smile 

Автор: DrHex 4.7.2009, 19:13
Цитата

ага, и код хука будет то-же находится в dll 

НУ и что?

Автор: Lazin 4.7.2009, 20:02
Цитата(DrHex @  4.7.2009,  19:13 Найти цитируемый пост)
НУ и что?

а ты уверен, что система сможет вызвать твой callback до того как поток завершится?  smile 

Автор: Riply 5.7.2009, 09:52
DLL_THREAD_DETACH ?

Автор: Lazin 5.7.2009, 10:02
так-как поток в этом случае завершается некорректно, DllMain c параметром DLL_THREAD_DETACH не вызывается

Автор: DrHex 5.7.2009, 17:41
Цитата

а ты уверен, что система сможет вызвать твой callback до того как поток завершится?

Вы забили как ставятся хуки(разумеется не виндовские)????

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