![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Добрый день.
У меня есть такой код, и я недавно заметил, что здесь есть утечка памяти, а именно, не вызывается деструктор объекта после завершения не основного потока.
Здесь суть в следующем. Создается глобальный объект класса thread_local, который при создании вызывает TlsAlloc, и получает индекс. При первом обращении из потока, он создает новый объект и помещает указатель на него в TLS, потом возвращает все время его. При удалении объекта thread_local, удаляется объект размещенный в том потоке, в котором происходит удаление, но объекты созданные в других потоках остаются, потом вызывается ф-я tlsFree. Как можно удалить объект, указатель на который хранится в tls перед во время завершения потока? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
в принципе, можно вызвать delete_value перед выходом из потока, можно использовать для этого RAII, но не хотелось-бы...
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
можно в отдельном watch-потоке (или в пуле потоков) вызвать функцию ожидания, передав ей дескриптор потока, данные которого нужно удалить по завершению, ну и при ее срабатывании, удалить глобальные указатели потока, который завершился
проблема только в том, что нужно информировать этот watch-поток о создании новых потоков, за которыми нужно следить т.е., при создании потока, его дескриптор нужно сразу передать в watch-поток или создать новый watch-поток (можно использовать пул потоков, так оптимальнее) можно конечно использовать DLL и отслеживать моменты создания и удаления потоков в DLLMain'е, тогда и watch-потоки не нужны, но по-моему, этот вариант слишком накладный: таскать за собой DLL ради автоматического удаления потоковых объектов проще всего, как это обычно и реализуется - обернуть функцию создания потока, например _beginthreadex и саму функцию потока с соответствующими в них инициализацией и удалением потоковых данных -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
нашел в бусте класс thread_specific_ptr, обещают что объект будет удаляться с помощью delete
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
boost::thread_specific_storage работает так как мне нужно, правда я не понимаю как оно это делает, нужно будет это выяснить
|
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
это как раз вариант с оберткой _beginthreadex:
и функции потока:
set_current_thread_data - инициализация run_thread_exit_callbacks - вызов всех ассоциированных callback'ов ну и попутное освобождение потоковых данных, если таковые были очевидно, есть свободные методы регистрации callback'ов отсюда можно плясать дальше, только для реализации такого механизма привязываться к boost'у совсем не обязательно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |