У меня сбой при использовании Boost.Spirit и Boost.Thread библиотеки в моем приложении. Это происходит только в том случае, если я использовал Дух парсер во время жизни процесса из основного потока.
Сбой происходит при выходе и, по-видимому, связан с очисткой хранилище, специфичное для потока, выделенное синтаксическим анализатором Spirit. Вероятно, происходит сбой из-за последовательности, в которой библиотеки DLL выгружен, поскольку конкретная память потока выделяется внутри DLL который уже был выгружен. Однако DLL Boost.Thread не выгружается до самого выхода из приложения.
Есть ли у меня способ заставить Spirit очистить свою нить хранилище, например в моей dll-main, когда я получаю уведомление об отсоединении процесса?
Любые решения / подсказки будут оценены.
PS! Моя платформа и настройки:





Boost.Spirit предназначен только для заголовков, то есть он не находится в своей собственной dll, поэтому, возможно, это не порядок выгрузки dll, а, скорее, другая проблема.
Убедитесь, что экземпляр, содержащий ваш парсер духа, удален и не оставляет висячих указателей.
Я нашел обходной путь.
В каждом месте, где я использую вызов boost :: spirit :: parse, я в основном создаю рабочий поток для его запуска, в то время как вызывающий поток блокирует вызов соединения с рабочим потоком. Не идеально, но, похоже, работает без каких-либо побочных эффектов.
Я все еще интересуюсь любыми альтернативами, так как чувствую, что отдельный поток на самом деле не нужен.
Вы нашли какой-либо отчет об ошибке по этой проблеме?
Я не. Но я тоже не отслеживал эту проблему с тех пор, как нашел обходной путь.
Сам Spirit является шаблоном «lib», так что вы правы, он не находится в собственной DLL. Однако он начинает использоваться (и, таким образом, создаются экземпляры шаблонов) внутри одной из моих DLL. Похоже, что висячий указатель на самом деле создан для меня самим Духом.