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

start [/forum/topic.php?fid=16&tid=1340712]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 429ms |

| 0 / 0 |
