2017-02-06 14 views
-2

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

そして、これはコールスタックです:私は気づくに失敗しています明らかに何かがある

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++ 

これはので、私は推測しているシンプルでなければなりません。あなたの代わりに任意の標準ライブラリクラスのための新しいのmalloc関数を使用している場合

+1

'トン=(STD ::スレッド*)はmalloc(NUM_THREADS *はsizeof *トン);' - あなたがやったすべてのメモリを割り当てられている - あなたは、任意の 'のstd :: thread'オブジェクトを作成していません。 'malloc'の使用を中止してください。 – PaulMcKenzie

+0

そして 'new'を使用しないでください。整数の指数で 'pow'を使用しないでください - (私は* 2,3)' 'Ns個= POW:'のstd :: vector'、あなたが知っている... – LogicStuff

+0

別の問題があります。あなたが期待する答えを得る保証はありません。 (http://stackoverflow.com/questions/25678481/why-does-pown-2-return-24-when-n-5-with-my-compiler-and-os)用 – PaulMcKenzie

答えて

5

、あなたのコードは単純に動作しません。 mallocはコンストラクタを呼び出さず、それらを呼び出すことは、すべての標準ライブラリクラスにとって絶対に必要です。あなたはなぜそんなことをすると思いますか?

+0

ありがとう!ここでC + +に慣れているハハCの男。 –

+1

@Mario他のコメントが指摘しているように、あなたはおそらく新しい/削除を使う必要はなく、一般的にそうしてはいけません。 –

+0

私はSOを通して読んできました。ほとんどの人は、初期化された/新しい/削除で破棄された配列の代わりにベクトルを使うことを示唆しているようです。ベクトルの方が簡単だからメモリ管理の観点からは理にかなっていると思いますが、これは私の主な関心事ではありません。 2つの方法の間でヒープ割り当て中のパフォーマンスに違いがあります。大きな入力信号を効率的に処理するためにFFTを並列化しようとしています。ベクトルがあまりにも多くのメモリを割り当てたり、予期せぬペナルティがあるかどうか。 –

関連する問題