I'm trying to spawn some threads on C++ using std::thread
but I can't get it to work. If it makes any difference I'm using VS 2015. It fails on thread creation ( t[thread_id] = std::thread(test);
). This is the relevant part of my code:
void test() {}
void threaded_DFT(std::complex<double>* x, std::complex<double>* X, size_t N) {
std::complex<double>* tmp=(std::complex<double>*)malloc(N * sizeof *tmp);
std::thread* t=NULL;
size_t num_threads;
size_t stages = log2(N);
size_t FFT_8_stages = stages / 3;
size_t remainder_stages = stages % 3;
size_t Ns = 1;
for (size_t i=0, Ns = 1; i < FFT_8_stages; i++,Ns=pow(2,3*i))
{
num_threads = N / 8;
t = (std::thread*)malloc(num_threads * sizeof *t);
if (!t)
exit(EXIT_FAILURE);
for (size_t thread_id = 0; thread_id < num_threads; thread_id++) {
t[thread_id] = std::thread(test);
//t[thread_id] = std::thread(FFT_8, x, X, N, Ns, thread_id);
}
for (size_t thread_id = 0; thread_id < num_threads; thread_id++) {
t[i].join();
}
x = X;
X = tmp;
tmp = x;
}
free(t);
...}
And this is the callstack:
ucrtbased.dll!00007ffd296a21c5() Unknown
ucrtbased.dll!00007ffd296a2363() Unknown
ucrtbased.dll!00007ffd296c388d() Unknown
ucrtbased.dll!00007ffd296c28f6() Unknown
SignalPlot.exe!std::thread::_Move_thread(std::thread & _Other) Line 111 C++
SignalPlot.exe!std::thread::operator=(std::thread && _Other) Line 68 C++
SignalPlot.exe!threaded_DFT(std::complex<double> * x, std::complex<double> * X, unsigned __int64 N) Line 224 C++
SignalPlot.exe!main(int argc, char * * argv) Line 322 C++
SignalPlot.exe!WinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, char * __formal, int __formal) Line 113 C++
This should be simple so I'm guessing there is something obvious I'm failing to notice.
If you use malloc instead of new for any standard library classes, your code simply won't work. malloc doesn't call constructors, and calling them is absolutely required for all Standard Library classes. Why would you ever think of doing such a thing?