2009-10-03 2 views
4

Есть ли способ получить уведомление о том, что поток не работает (вернулся) в вашем приложении?
Я знаю, что это возможно в режиме ядра (используя PsSetCreateThreadNotifyRoutine), но есть ли способ узнать это из пользовательского режима, используя только Win32 API?Уведомление о том, что поток уничтожен

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

В моем коде используется хранилище TLS, а под Linux/Unix pthread_key_create может быть указатель на функцию, вызываемую при уничтожении потока. Но TlsAlloc (Windows) не имеет ничего подобного ...

Заранее спасибо!

+1

см. Http://stackoverflow.com/questions/301054/how-can-i-determine-if-a-win32-thread-has-terminated –

ответ

5

Зависит от того, какой libraray у вас есть. Для DLL может обрабатывать завершение потока в вашем DllMain (DLL_THREAD_DETACH). В MSDN говорится, что это лучшее место для работы с ресурсами TLS.

Имейте в виду, что этот обратный вызов обрабатывается только для потока, выходящего чисто (не от TerminateThread()).

+0

Да, это DLL. Кажется, это лучше всего подходит для моего случая. –

5

Аналогичная функциональность доступна с помощью волокон. Из MSDN:

FlsAlloc, FlsCallback, FlsFree

FlsCallback Callback Функция

Применение определенная функция. Если используется слот FLS, FlsCallback - , вызывающий удаление волокна, выход потока, и когда FLS-индекс освобождается.

+2

Теперь я увидел, что это не работает под Win Xp, только 2003 и Vista :( –

2

Вы можете просто вызвать WaitForSingleObject на дескрипторе потока.

2

Вы могли бы попробовать установить в IAT зашивки API крюк на ExitThread() ...

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

Смотреть объявление: Windows API spying/hijacking techniques для некоторых деталей по этому виду подсекать ...

+1

примечание к себе, должно было спросить, является ли «библиотека» dll ... –

Смежные вопросы