powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Отловить завершение чужих потоков
18 сообщений из 18, страница 1 из 1
Отловить завершение чужих потоков
    #39237623
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос знатокам WinAPI (и желательно POSIX)

В произвольное время разные потоки дёргают мою функцию. Причём потоки могут быть созданы в отдельном Dll кем угодно.
В момент вызова функции я могу получить CurretThreadId.
Необходимо, зная эти ThreadId, навесить на потоки какой-нибудь калбек, который будет вызываться после завершения потока. С эксепшном или в штатном режиме.
Каким образом?

Опережая вопрос "зачем тебе это".
Есть несколько мультипоточных высоконагруженных проектов. Причём бывает потоки создаются в сторонней Dll.
Было решено поменять принципы обработки данных, задействуя threadvar и кеширование данных/буферов.
Но беда в том, что threadvar-области не финализируются при завершении потока.
Тот же TParallel постоянно создаёт и удаляет потоки, а у нас течёт память, причём серьёзно.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237647
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаешь свой поток. Туда передаешь хэндлы (не ID) см. OpenThread() затем там ждешь завершения WaitMultipleObject() и по мере завершения чистишь свои threadvar-области.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237712
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
SOFT FOR YOU,

DLL_THREAD_DETACH не оно?
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237716
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237738
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseDLL_THREAD_DETACH не оно?
SOFT FOR YOUпотоки создаются в сторонней Dll.
Сам как думаешь?
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237762
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima TeNoseDLL_THREAD_DETACH не оно?
SOFT FOR YOUпотоки создаются в сторонней Dll.
Сам как думаешь?
SOFT FOR YOUВ произвольное время разные потоки дёргают мою функцию его функция - неизвестно что это и где.
я предположил, что в dll.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237779
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
SOFT FOR YOUЕсть несколько мультипоточных высоконагруженных проектов с вероятностью 99% там статическая линковка или динамическая, но в основном процессе.
и твоя dll получит DLL_THREAD_DETACH при завершении потока.

SOFT FOR YOUПричём бывает потоки создаются в сторонней Dll это не важно. CurretThreadId у потока, он одинаков для всех участников (dll).
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237950
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, eNose,

Такой подход наверное тоже некорректен.
Калбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS.
В предложенном вами варианте - я его не увижу.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39237957
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКалбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS.
Не обязательно. При инициализации выделяй память в куче, а в TLS просто храни указатель на эту память. Контролирующему потоку тоже давай этот указатель, тогда ему не надо будет никакого доступа к TLS.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238022
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извращенцы такие извращенцы... https://habrahabr.ru/post/157783/
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238055
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneИзвращенцы такие извращенцы... https://habrahabr.ru/post/157783/
ИМХУ не в тему.
Глубоко с TLS не разбирался, но как понимаю после завершения потока его TLS уже ниоткуда недоступен. Проблема у ТС именно в этом.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238056
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

Ну неплохо, доступ к TLS
Только мне от TLS нужны конкретные переменные в threadvar, а они могут находиться в TLS по произвольному смещению.
Зависит от порядка подключаемых модулей с threadvar. Ну и от exe/dll тоже зависит, но там смещение найти можно.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238145
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBarloneИзвращенцы такие извращенцы... https://habrahabr.ru/post/157783/
ИМХУ не в тему.
Глубоко с TLS не разбирался, но как понимаю после завершения потока его TLS уже ниоткуда недоступен. Проблема у ТС именно в этом.Думаю, что пока есть открытый хендл потока, его данные живы.
SOFT FOR YOUТолько мне от TLS нужны конкретные переменные в threadvar, а они могут находиться в TLS по произвольному смещению.Так, это же ваш код их туда поместил?
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238322
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

Конечно. Если я нахожусь внутри потока - я без проблем обращаюсь к threadvar
А если я делаю WaitMultipleObject в другом потоке - тогда я тот threadvar уже не вижу
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238805
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU, вы используете TlsSetValue/TlsGetValue или __declspec(thread)/__thread?
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39238951
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneSOFT FOR YOU, вы используете TlsSetValue/TlsGetValue или __declspec(thread)/__thread?

Не TlsSetValue/TlsGetValue
В Delphi есть служебное слово threadvar, позволяющее объявить такие переменные наравне с обычными
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39239076
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUDima T, eNose,

Такой подход наверное тоже некорректен.
Калбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS.
В предложенном вами варианте - я его не увижу.А ты попробуй и увидишь.
...
Рейтинг: 0 / 0
Отловить завершение чужих потоков
    #39240741
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUВопрос знатокам WinAPI (и желательно POSIX)

В произвольное время разные потоки дёргают мою функцию. Причём потоки могут быть созданы в отдельном Dll кем угодно.
В момент вызова функции я могу получить CurretThreadId.
Необходимо, зная эти ThreadId, навесить на потоки какой-нибудь калбек, который будет вызываться после завершения потока. С эксепшном или в штатном режиме.
Каким образом?

Опережая вопрос "зачем тебе это".
Есть несколько мультипоточных высоконагруженных проектов. Причём бывает потоки создаются в сторонней Dll.
Было решено поменять принципы обработки данных, задействуя threadvar и кеширование данных/буферов.
Но беда в том, что threadvar-области не финализируются при завершении потока.
Тот же TParallel постоянно создаёт и удаляет потоки, а у нас течёт память, причём серьёзно.


температуру мерил?
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Отловить завершение чужих потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]