Я пишу функцию для получения преобразования Фурье:
void test(std::vector<double>& vFactorYield) {
int len = vFactorYield.size();
std::vector<double> vAmplitude;
vAmplitude.reserve(len/2+1);
double *in = nullptr;
fftw_complex *out = nullptr;
in = (double *)fftw_malloc(sizeof(double) * len);
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len);
fftw_plan p = fftw_plan_dft_r2c_1d(len, in, out, FFTW_ESTIMATE);
fftw_execute(p);
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
}
и в основном. cpp:
int main(){
std::vector<int> v1;
std::vector<int> v2;
std::thread t1(test,v1)
std::thread t2(test,v2);
t1.join();
t2.join();
}
Получу ли я правильный результат? Раз уж я заметил DO C (http://www.fftw.org/fftw3.pdf) говорит:
«единственная поточно-безопасная процедура в FFTW - это fftw_execute (и его варианты newarray). Все остальные подпрограммы (например, планировщик ) следует вызывать только из одного потока за раз. "
Итак, насколько я понимаю, функция fftw_execute (fftw_plan) будет использовать все ядра для вычислений. Поэтому, чтобы избежать потенциальной угрозы, в моей основной функции , Надо уточнить "fftw_make_planner_thread_safe (void)"