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

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

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

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

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

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

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

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

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

Такой подход наверное тоже некорректен.
Калбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS.
В предложенном вами варианте - я его не увижу.А ты попробуй и увидишь.
...
Рейтинг: 0 / 0
21.05.2016, 19:18
    #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]