| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > удаление данных из TLS |
| Автор: Lazin 15.4.2009, 08:47 | ||
| Добрый день. У меня есть такой код, и я недавно заметил, что здесь есть утечка памяти, а именно, не вызывается деструктор объекта после завершения не основного потока.
Здесь суть в следующем. Создается глобальный объект класса thread_local, который при создании вызывает TlsAlloc, и получает индекс. При первом обращении из потока, он создает новый объект и помещает указатель на него в TLS, потом возвращает все время его. При удалении объекта thread_local, удаляется объект размещенный в том потоке, в котором происходит удаление, но объекты созданные в других потоках остаются, потом вызывается ф-я tlsFree. Как можно удалить объект, указатель на который хранится в tls перед во время завершения потока? |
| Автор: Lazin 15.4.2009, 09:11 |
| в принципе, можно вызвать delete_value перед выходом из потока, можно использовать для этого RAII, но не хотелось-бы... |
| Автор: GremlinProg 15.4.2009, 11:46 |
| можно в отдельном watch-потоке (или в пуле потоков) вызвать функцию ожидания, передав ей дескриптор потока, данные которого нужно удалить по завершению, ну и при ее срабатывании, удалить глобальные указатели потока, который завершился проблема только в том, что нужно информировать этот watch-поток о создании новых потоков, за которыми нужно следить т.е., при создании потока, его дескриптор нужно сразу передать в watch-поток или создать новый watch-поток (можно использовать пул потоков, так оптимальнее) можно конечно использовать DLL и отслеживать моменты создания и удаления потоков в DLLMain'е, тогда и watch-потоки не нужны, но по-моему, этот вариант слишком накладный: таскать за собой DLL ради автоматического удаления потоковых объектов проще всего, как это обычно и реализуется - обернуть функцию создания потока, например _beginthreadex и саму функцию потока с соответствующими в них инициализацией и удалением потоковых данных |
| Автор: Lazin 15.4.2009, 12:57 |
| нашел в бусте класс thread_specific_ptr, обещают что объект будет удаляться с помощью delete |
| Автор: Lazin 15.4.2009, 13:12 |
| boost::thread_specific_storage работает так как мне нужно, правда я не понимаю как оно это делает, нужно будет это выяснить |
| Автор: GremlinProg 15.4.2009, 14:29 | ||||
это как раз вариант с оберткой _beginthreadex:
и функции потока:
set_current_thread_data - инициализация run_thread_exit_callbacks - вызов всех ассоциированных callback'ов ну и попутное освобождение потоковых данных, если таковые были очевидно, есть свободные методы регистрации callback'ов отсюда можно плясать дальше, только для реализации такого механизма привязываться к boost'у совсем не обязательно |