Из -за ограничений на 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
Очистка потоков в dll: _endthreadex () vs terminatethread () ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1738362600
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/39241400/cleaning-up-threads-in-a-dll-endthreadex-vs-terminatethread[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия