FFTW3的正确初始化和优雅关闭

Correct initialization and graceful shutdown of FFTW3

我在软件的多个地方使用 FFTW3。然而,这些不同的 places/functions/modules 相互之间并不了解,它们被调用的顺序(包括它们自己的初始化和清理)是无法预测的。当涉及到 FFTW3 的初始化和正常关闭时,这会导致混乱。

一个快速的解决方案是分别在 main() 函数的开头和结尾盲目地调用上述两个函数。然而,这是糟糕的设计,是不可接受的。应用程序本身应该对 FFTW3 一无所知。只有使用 FFTW3 的模块应该知道 FFTW3。我目前的解决方案是有一个额外的模块,它充当这两个函数的包装器,并跟踪 FFTW3 是否已初始化或关闭。如果一个模块请求FFTW3初始化,而FFTW3没有初始化,那么它会调用fftw_init_threads()。否则,它只会增加一个内部计数器和return。 fftw_cleanup_threads() 函数实现了类似的东西。当且仅当应用程序的模块使用包装器来初始化和关闭 FFTW3 时,此解决方案才有效。

所以我想知道,你们是如何解决这个问题的?有没有办法查询 FFTW3 库本身并检查它是否已初始化?我无法在文档中找到任何内容。

谢谢

多次调用fftw_init_threads是安全的,FFTW3会跟踪其初始化状态(threads/api.c中的全局变量threads_inited)如果前一个有效,则不会重复初始化。

你可以多次调用fftw_cleanup_threads,如果没有初始化,它知道不要重复这个过程。

您在应用程序中需要避免的是从模块调用 fftw_cleanup_threads 而其他人可能仍在使用 FFTW。

您可以使用全局计数器来做到这一点,以跟踪有多少模块正在使用 FFTW,并且只在最后一个完成时调用 fftw_cleanup_threads()。