Альтернатива Win32 для деструктора в pthread_keycreate (когда я не могу управлять dllmain) - PullRequest
4 голосов
/ 23 октября 2010

В pthreads вы можете связать функцию деструктора с каждым слотом памяти для каждого потока. Когда поток умирает, если слот не равен 0, вызывается деструктор.

В Win32 DLL функция DLLMain, вызываемая при выходе из потока, может делать то же самое.

Что я могу сделать в коде, который находится в чисто статической библиотеке?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Это сложная проблема, требующая прикрепления обратных вызовов в особых местах.К счастью для вас, это решено в Boost.Thread .Используйте boost::this_thread::at_thread_exit или boost::thread_specific_ptr

0 голосов
/ 23 октября 2010

Windows поддерживает локальное хранилище потоков (TLS) в DLL.Это может быть очень практичным, если вы хотите иметь несколько блоков памяти на поток с уникальным значением (уникальным для потока).Внутри любой другой функции из DLL вы можете очень просто получить значение, соответствующее текущему потоку .Это очень полезно в некоторых сценариях.Посмотрите здесь для получения более подробной информации.

Я сам не пользуюсь pthreads, но я полагаю, что слот для каждого потока введен, чтобы сделать работу с TLS более комфортной.

ОБНОВЛЕНО : Из вашего комментария я вижу, что вы неправильно поняли мой ответ.Я не разработчик POSIX, я занимаюсь разработкой только для Win32, и ваш вопрос касается возможностей WIn32 API распределения и освобождения для каждого потока.Я пытаюсь объяснить возможности, и вы сами можете решить, какой из них лучше для ваших конкретных сценариев.

Эквивалент pthread_XXX функций в Win32 следующие:

I not рекомендовал использовать конструкцию __ declspec (thread) , что более характерно для компилятора.

Пример Использование локального хранилища потоков показывает, как использовать локальное хранилище потоков (TLS) без DLL, но яЛично мне нравится и используется TLS только в DLL.

Параметр destructor функции pthread_key_create не имеет аналогов в Win32, но я не вижу здесь никаких проблем.Все компиляторы C / C ++ поддерживают __try {/**/} __finally {/**/} конструкцию Структурированной обработки исключений , так что вы можете использовать ее в теле своей функции потока и реализовать таким образом, как Очистка ресурсов точно так же, какВы можете сделать это в главном потоке.

Мне жаль, что вы не включили в свой вопрос пример, который показывает, как вы обычно используете деструктор функции pthread_key_create ,Я считаю, что примеры могут прояснить многое без большого количества слов.Поэтому, если мой ответ не поможет вам, мы можем лучше объяснить все в примерах: вы напишите пример и, возможно, краткий комментарий о том, что он должен делать, и я мог бы написать тот же код, используя Win32 API, только на C или C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...