2016-12-08 2 views
0

this codeに基づいて、入力引数にスレッドの数がnum_threadsと決定され、これらのスレッドが与えられた入力パラメータで同じメソッドを呼び出す必要がある単純なマルチスレッドプログラムを実行しようとしています。C++でのベクトルによるマルチスレッド

thread_idの再定義のためにnum_items > num_threadsが発生したときに問題が発生しました(すべてのスレッドが使用後に結合されているにもかかわらず)。

terminate called after throwing an instance of 'std::system_error' 
    what(): Invalid argument 
+2

基本的なカウントエラーです。あなたが持っているループラウンド数について考えてみましょう。 –

答えて

2

あなただけ常にベクトルに追加しているので、古いスレッドがそこに滞在扱い、あなたが一緒に(joinにそれらを再しよう:

vector<thread> thread_id; 

int it = num_items/num_threads + (num_items%num_threads != 0); 
for(int i = 0; i < it; i++){ 
    for(int j = 0; j < num_threads; ++j) 
     thread_id.push_back(thread(method1, "parameter", i*num_threads + j)); 

    for(auto& t : threadId) 
     t.join(); 
} 

エラーコードは以下のとおりです。新しいもの)はstd::system_erroras documentedです。

あなたj - ループの最後にこれを試してみてください。

また
thread_id.clear() 

に等しいかnum_itemsより大きくなるであろう、num_threadsの倍数が常に作成されることに注意してください。最後の反復処理を別の方法で処理することもできます(値をi*num_threads + jに追加するだけです)。

関連する問題