线程创建C ++ std :: thread时抛出异常

时间:2017-02-06 21:02:09

标签: c++ stdthread

我试图使用std::thread在C ++上生成一些线程,但我无法让它工作。如果它与VS 2015有任何区别。它在创建线程时失败(t[thread_id] = std::thread(test);)。这是我的代码的相关部分:

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);
...}

这就是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++

这应该很简单,所以我猜测有一些显而易见的事情我没有注意到。

1 个答案:

答案 0 :(得分:5)

如果对任何标准库类使用malloc而不是new,则代码将无法正常工作。 malloc不调用构造函数,并且所有标准库类都绝对需要调用它们。为什么你会想到做这样的事情?