私はg ++ 4.8を使ってC++ 11プログラムを書いています。私は、単一のスレッドプログラムをマルチスレッドプログラムに変換しようとしています。スレッド化されたバージョンの結合は、コンパイルエラーをスローします。私が間違っているところを教えてください。C++ - スレッドのベクトルに参加する
シングルスレッド(正常に動作します): すべての引数は参照渡しであることに注意してください。
for (const auto& i : vec_clients)
{
i->startSim(vec_masters, vec_trace1, vec_trace2, vec_trace3);
}
マルチスレッド・バージョン:
std::vector<std::thread> vec_thr;
for (const auto& i : vec_clients)
{
std::thread t1(&Client::startSim, std::move(i), std::move(vec_trace1), std::move(vec_trace2), std::move(vec_trace3));
vec_thr.push_back(std::move(t1));
}
for (unsigned int i=0; i<vec_thr.size(); ++i)
{
// if (i.joinable())
vec_thr.at(i).join();
}
変形(簡単な例):そのまま
class Test
{
private:
public:
void testme(const std::string& _str)
{
std::cout << "Hello "+_str << std::endl;
}
};
int main(const int argc, const char **argv)
{
std::string str = "there";
Test t1;
std::vector<std::thread> vec_thr;
std::thread thr1(&Test::testme, std::move(t1), std::cref(str));
vec_thr.push_back(thr1);
return 0;
}
あなたが「エラーを投げ終わる」とは何を意味するのですか?ビルドエラーが出ますか?クラッシュ?例外?他に何か?詳しく教えてください。 –
* "エラー" *ちょうど2 downvotesを要した。 – LogicStuff
また、 'std :: thread'を使っても、引き数を引き続き参照渡しすることができます。例えば '' std :: ref'や 'std :: cref'(http://en.cppreference.com/w/cpp/utility/functional/ref)を使ってください。 'std :: thread t1(&Client :: startSim、i、std :: cref(vec_trace1)、std :: cref(vec_trace2)、std :: cref(vec_trace3))' –