Ich verwende g ++ 4.8, um ein C++ 11-Programm zu schreiben. Ich versuche, ein einzelnes Thread-Programm in Multi-Thread-Programm zu konvertieren. Der Join in der Threaded-Version endet mit einem Kompilierungsfehler. Könnten Sie mir bitte sagen, wo ich falsch liege?C++ - Verknüpfen Sie einen Vektor von Threads
Single Threaded (funktioniert gut): Beachten Sie, dass alle Argumente durch Verweis übergeben werden.
for (const auto& i : vec_clients)
{
i->startSim(vec_masters, vec_trace1, vec_trace2, vec_trace3);
}
Multi-Threaded-Version:
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();
}
Modified (einfacheres Beispiel):
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;
}
Was meinen Sie mit „landet einen Fehler werfen“? Erhalten Sie einen Buildfehler? Ein Unfall? Eine Ausnahme? Etwas anderes? Bitte erläutern. –
* "ein Fehler" * kostet nur 2 downvotes. – LogicStuff
Beachten Sie auch, dass Sie Argumente immer noch als Referenz übergeben können, selbst wenn Sie 'std :: thread' verwenden. Verwende ['std :: ref' oder' std :: cref'] (http://en.cppreference.com/w/cpp/utility/functional/ref) wie z.B. 'std :: thread t1 (& Client :: startSim, ich, std :: cref (vec_trace1), std :: cref (vec_trace2), std :: cref (vec_trace3))' –