Очистка потоков в dll: _endthreadex () vs terminatethread ()C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Очистка потоков в dll: _endthreadex () vs terminatethread ()

Сообщение Anonymous »

Из -за ограничений на Dllmain (и я понял, что то же самое относится и к глобальным и статическим конструкторам и деструкторам в DLL), такая простая вещь, как синглтонский регистратор с асинхронным написанием/поток записи/промывки. Синглтонский регистратор находится в DLL, и я оказываю ограниченное влияние на исполняемую загрузку и разгрузку этого DLL время от времени. Я могу заставить эту исполняемую работу, чтобы вызвать мою функцию инициализации DLL перед каким -либо использованием, поэтому в функции инициализации я могу использовать критический раздел, чтобы охранять переменную, сообщающую, был ли DLL уже инициализирован или ей нуждается в начале на этот раз. Такого способа инициализации от dllmain избегается, что приведет к тупику, потому что мне нужно запустить потоки из инициализации, а потоки вызывают dllmain с помощью DLL_THREAD_ATTACH , и это получает ту же блокировку загрузчика, что и у. Получен, когда мы инициализируем в dllmain on dll_process_attach event.

c ++ 11 Поток не может быть использован из -за этой ошибки (не исправлено в MSVC ++ 2013). Итак, я использую _beginthreadex () < /code>, потому что CreateThread < /code> документация говорит: < /p>


Поток в исполняемом Вызовы в библиотеке времени выполнения (CRT) должны использовать функции _beginthreadex и _endthreadex для управления потоком, а не CreateThread и ExitThread; Это требует использования многопоточной версии CRT. Если поток, созданный с использованием CreateThread, вызывает CRT, CRT может завершить процесс в условиях с низкой памяти. над исполняемым файлом, чтобы гарантировать, что некоторая функция деинициализации от DLL вызывается перед выгрузкой DLL. Таким образом, единственными параметрами для очистки являются dllmain dll_process_detach и деструкторы глобальных/статических переменных. Проблема в том, что они вызываются с полученной блокировкой загрузчика, поэтому я не могу сделать поток DLL для изящного выхода, потому что эти потоки на обычном выходе попытаются вызвать dllmain с помощью dll_thread_detach , что привело бы к тупик (снова блокировка загрузчика). MSDN предлагает использовать terminatethread () < /code> для обработки этого: < /p>


dll a Получает сообщение DLL_Process_detach в своем dllmain и устанавливает событие Для потока t сигнализируя его в выход.
Think T завершает свою текущую задачу, приводит себя в согласованное состояние, сигнализирует DLL A и ожидает бесконечно. Обратите внимание, что процедуры проверки согласованности должны следовать тем же ограничениям, что и dllmain, чтобы избежать смертоносных знаков. />
Итак, я боюсь использовать _beginThreadex () + terminateThread () , вместо разработанной _endthreadex () (последнее будет вызвано Сам потоком, если поток возвращался нормально). < /p>

tl; dr < /strong> рассмотрим поток, который возвращается из своей функции входа и поток, который что -то вроде сна (бесконечно) в конце своей функции в ожидании завершения (т. Е. После того, как он получил ресурсы и сигнализировал о прекращающем потоке, что он готов). Есть ли утечка CRT или C ++ 11 (например, Thread_local ) и т. Д. Или или получайте поврежденную и т. Д. Если _endthreadex () не вызывается, но TerminatThread () вместо этого вызывается? /p>

Подробнее здесь: https://stackoverflow.com/questions/392 ... natethread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»