
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
17.05.2016, 17:11
|
|||
|---|---|---|---|
|
|||
Отловить завершение чужих потоков |
|||
|
#18+
Вопрос знатокам WinAPI (и желательно POSIX) В произвольное время разные потоки дёргают мою функцию. Причём потоки могут быть созданы в отдельном Dll кем угодно. В момент вызова функции я могу получить CurretThreadId. Необходимо, зная эти ThreadId, навесить на потоки какой-нибудь калбек, который будет вызываться после завершения потока. С эксепшном или в штатном режиме. Каким образом? Опережая вопрос "зачем тебе это". Есть несколько мультипоточных высоконагруженных проектов. Причём бывает потоки создаются в сторонней Dll. Было решено поменять принципы обработки данных, задействуя threadvar и кеширование данных/буферов. Но беда в том, что threadvar-области не финализируются при завершении потока. Тот же TParallel постоянно создаёт и удаляет потоки, а у нас течёт память, причём серьёзно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.05.2016, 17:28
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
Делаешь свой поток. Туда передаешь хэндлы (не ID) см. OpenThread() затем там ждешь завершения WaitMultipleObject() и по мере завершения чистишь свои threadvar-области. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.05.2016, 18:45
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
SOFT FOR YOU, DLL_THREAD_DETACH не оно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.05.2016, 18:50
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.05.2016, 19:51
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
eNoseDLL_THREAD_DETACH не оно? SOFT FOR YOUпотоки создаются в сторонней Dll. Сам как думаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.05.2016, 21:09
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
Dima TeNoseDLL_THREAD_DETACH не оно? SOFT FOR YOUпотоки создаются в сторонней Dll. Сам как думаешь? SOFT FOR YOUВ произвольное время разные потоки дёргают мою функцию его функция - неизвестно что это и где. я предположил, что в dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.05.2016, 21:58
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
SOFT FOR YOUЕсть несколько мультипоточных высоконагруженных проектов с вероятностью 99% там статическая линковка или динамическая, но в основном процессе. и твоя dll получит DLL_THREAD_DETACH при завершении потока. SOFT FOR YOUПричём бывает потоки создаются в сторонней Dll это не важно. CurretThreadId у потока, он одинаков для всех участников (dll). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 10:02
|
|||
|---|---|---|---|
|
|||
Отловить завершение чужих потоков |
|||
|
#18+
Dima T, eNose, Такой подход наверное тоже некорректен. Калбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS. В предложенном вами варианте - я его не увижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 10:07
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
SOFT FOR YOUКалбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS. Не обязательно. При инициализации выделяй память в куче, а в TLS просто храни указатель на эту память. Контролирующему потоку тоже давай этот указатель, тогда ему не надо будет никакого доступа к TLS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 11:02
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
Извращенцы такие извращенцы... https://habrahabr.ru/post/157783/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 11:23
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
BarloneИзвращенцы такие извращенцы... https://habrahabr.ru/post/157783/ ИМХУ не в тему. Глубоко с TLS не разбирался, но как понимаю после завершения потока его TLS уже ниоткуда недоступен. Проблема у ТС именно в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 11:23
|
|||
|---|---|---|---|
|
|||
Отловить завершение чужих потоков |
|||
|
#18+
Barlone, Ну неплохо, доступ к TLS Только мне от TLS нужны конкретные переменные в threadvar, а они могут находиться в TLS по произвольному смещению. Зависит от порядка подключаемых модулей с threadvar. Ну и от exe/dll тоже зависит, но там смещение найти можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 12:21
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
Dima TBarloneИзвращенцы такие извращенцы... https://habrahabr.ru/post/157783/ ИМХУ не в тему. Глубоко с TLS не разбирался, но как понимаю после завершения потока его TLS уже ниоткуда недоступен. Проблема у ТС именно в этом.Думаю, что пока есть открытый хендл потока, его данные живы. SOFT FOR YOUТолько мне от TLS нужны конкретные переменные в threadvar, а они могут находиться в TLS по произвольному смещению.Так, это же ваш код их туда поместил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.05.2016, 14:55
|
|||
|---|---|---|---|
|
|||
Отловить завершение чужих потоков |
|||
|
#18+
Barlone, Конечно. Если я нахожусь внутри потока - я без проблем обращаюсь к threadvar А если я делаю WaitMultipleObject в другом потоке - тогда я тот threadvar уже не вижу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
19.05.2016, 10:10
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
SOFT FOR YOU, вы используете TlsSetValue/TlsGetValue или __declspec(thread)/__thread? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
19.05.2016, 11:54
|
|||
|---|---|---|---|
|
|||
Отловить завершение чужих потоков |
|||
|
#18+
BarloneSOFT FOR YOU, вы используете TlsSetValue/TlsGetValue или __declspec(thread)/__thread? Не TlsSetValue/TlsGetValue В Delphi есть служебное слово threadvar, позволяющее объявить такие переменные наравне с обычными ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
19.05.2016, 13:36
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
SOFT FOR YOUDima T, eNose, Такой подход наверное тоже некорректен. Калбек по идее должен вызываться в завершающемся потоке. Потому что нужен доступ к TLS. В предложенном вами варианте - я его не увижу.А ты попробуй и увидишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.05.2016, 19:18
|
|||
|---|---|---|---|
Отловить завершение чужих потоков |
|||
|
#18+
SOFT FOR YOUВопрос знатокам WinAPI (и желательно POSIX) В произвольное время разные потоки дёргают мою функцию. Причём потоки могут быть созданы в отдельном Dll кем угодно. В момент вызова функции я могу получить CurretThreadId. Необходимо, зная эти ThreadId, навесить на потоки какой-нибудь калбек, который будет вызываться после завершения потока. С эксепшном или в штатном режиме. Каким образом? Опережая вопрос "зачем тебе это". Есть несколько мультипоточных высоконагруженных проектов. Причём бывает потоки создаются в сторонней Dll. Было решено поменять принципы обработки данных, задействуя threadvar и кеширование данных/буферов. Но беда в том, что threadvar-области не финализируются при завершении потока. Тот же TParallel постоянно создаёт и удаляет потоки, а у нас течёт память, причём серьёзно. температуру мерил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=16&mobile=1&tid=1340712]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 473ms |

| 0 / 0 |
