У меня есть 32-битное приложение для Windows, написанное в основном на Delphi, которое выполняет численное моделирование с плавающей запятой, используя 8087 FPU. Недавно я добавил возможность подключать внешний код Python, используя Python API через python2x.dll. Это недавнее изменение привело к очень странному поведению.
Приложение имеет пакетный режим работы, в котором оно выполняет несколько симуляций параллельно, чтобы использовать преимущества многоядерных архитектур. Как только в процессе выполняется код Python, я начинаю видеть изменения в управляющем слове 8087 в разных потоках. Я проверил это очень тщательно и заметил, что управляющее слово изменилось даже в потоке, который никогда не обращался к библиотеке Python DLL.
Я знаю, что это звучит фантастически, но, как я обнаружил, существуют механизмы проявления такого поведения. Я узнал о сигналах. Сначала я предположил, что библиотека Python DLL устанавливает обработчики сигналов для всего процесса (вызывая signal()
), и эти обработчики сигналов отвечают за изменение управляющего слова. Например, поток, не связанный с кодом Python, может вызвать SIGFPE
, который, в свою очередь, может изменить управляющее слово.
Я скорее пришел к выводу, что signal()
не является механизмом. Я организовал выполнение кода Python при запуске. Затем я установил обработчики сигналов обратно на SIG_DFL
. Затем я запустил симуляцию. Но по-прежнему происходило изменение управляющего слова.
Мой вопрос (в заключение) заключается в том, знает ли кто-нибудь другой механизм, с помощью которого управляющее слово может быть изменено таким образом. Я ищу прерывания, APC и т.д., я думаю!
Обновление
Управляющее слово изменяется на 0x037F
, что является значением Intel по умолчанию. Это отличается от значения по умолчанию MSVC/Windows 0x027F
. Я предполагаю, что что-то вызывает FPINIT
.
Я также обнаружил Py_InitializeEx
который позволяет вызывающей стороне остановить Python, устанавливающий обработчики сигналов. Изменения управляющего слова происходят, даже если я использую этот подход к инициализации, поэтому я еще больше убежден, что дело не в этом механизме.