Я использую FFTW3 в нескольких местах моего программного обеспечения. Однако эти разные места / функции / модули не знают друг о друге, и порядок их вызова (включая их собственную инициализацию и очистку) предсказать невозможно. Это приводит к путанице, когда дело доходит до инициализации и постепенного отключения FFTW3.
- FFTW3 имеет функцию с именем
fftw_init_threads()
, которая должна вызываться только один раз перед использованием любой функции FFTW3. Поскольку я не знаю, какой из модулей приложения (который использует FFTW3) инициализируется первым, как я могу убедиться, что я вызываю эту функцию только один раз во всем приложении?
- FFTW3 имеет функцию с именем
fftw_cleanup_threads()
, которая должна вызываться один раз в самом конце приложения для очистки содержимого. Любые вызовы функций FFTW3 после этого вызова не будут выполнены. Опять же, поскольку я не знаю, какая подсистема моего приложения отключается последней, как я могу убедиться, что я вызываю эту функцию один раз в самом конце?
Одним из быстрых решений было бы слепо вызывать две вышеупомянутые функции только в начале и конце моей функции main()
соответственно. Однако это плохой дизайн и не приемлемо. Само приложение не должно ничего знать о FFTW3. Только модули, использующие FFTW3, должны знать о FFTW3. Мое текущее решение состоит в том, чтобы иметь дополнительный модуль, который действует как обертка вокруг двух функций и отслеживает, был ли FFTW3 инициализирован или завершен. Если модуль запрашивает инициализацию FFTW3, а FFTW3 не инициализируется, то он вызовет fftw_init_threads()
. В противном случае он просто увеличит внутренний счетчик и вернется. Нечто подобное реализовано для функции fftw_cleanup_threads()
. Это решение работает, если и только если модули приложения используют оболочку для инициализации и завершения FFTW3.
Так что мне интересно, как вы, ребята, решаете эту проблему? Есть ли способ запросить саму библиотеку FFTW3 и проверить, инициализирована она или нет? Я не смог найти что-то в документации.
Спасибо