FFTW3的正确初始化和优雅关闭
Correct initialization and graceful shutdown of FFTW3
我在软件的多个地方使用 FFTW3。然而,这些不同的 places/functions/modules 相互之间并不了解,它们被调用的顺序(包括它们自己的初始化和清理)是无法预测的。当涉及到 FFTW3 的初始化和正常关闭时,这会导致混乱。
- FFTW3 有一个名为
fftw_init_threads()
的函数,应该在使用任何 FFTW3 函数之前只调用一次。由于我不知道哪个应用程序模块(使用 FFTW3)首先被初始化,我怎样才能确保我在整个应用程序中只调用一次这个函数?
- FFTW3 有一个名为
fftw_cleanup_threads()
的函数,它应该在应用程序的最后调用一次以清理东西。在此调用之后对 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()。
我在软件的多个地方使用 FFTW3。然而,这些不同的 places/functions/modules 相互之间并不了解,它们被调用的顺序(包括它们自己的初始化和清理)是无法预测的。当涉及到 FFTW3 的初始化和正常关闭时,这会导致混乱。
- FFTW3 有一个名为
fftw_init_threads()
的函数,应该在使用任何 FFTW3 函数之前只调用一次。由于我不知道哪个应用程序模块(使用 FFTW3)首先被初始化,我怎样才能确保我在整个应用程序中只调用一次这个函数? - FFTW3 有一个名为
fftw_cleanup_threads()
的函数,它应该在应用程序的最后调用一次以清理东西。在此调用之后对 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()。