2016-07-16 19 views
-3

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; 
} 
+2

Was meinen Sie mit „landet einen Fehler werfen“? Erhalten Sie einen Buildfehler? Ein Unfall? Eine Ausnahme? Etwas anderes? Bitte erläutern. –

+0

* "ein Fehler" * kostet nur 2 downvotes. – LogicStuff

+0

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))' –

Antwort

0

Falls jemand noch interessiert, ist dies die Antwort lautet:

class Test 
{ 
private: 
public: 
    void testme(const std::string& _str) 
    { 
     std::cout << "Hello "+_str << std::endl; 
    } 

    void testme2(const std::string& _str) 
    { 
     std::cout << "Hello to "+_str << std::endl; 
    } 
}; 

int main(const int argc, const char **argv) 
{ 
    std::string str = "there"; 
    std::unique_ptr<Test> up1(new Test()); 
    std::unique_ptr<Test> up2(new Test()); 
    std::vector<std::thread> vec_thr; 
    std::thread thr1(&Test::testme, std::move(up1), std::ref(str)); 
    std::thread thr2(&Test::testme2, std::move(up2), std::ref(str)); 
    vec_thr.push_back(std::move(thr1)); 
    vec_thr.push_back(std::move(thr2)); 
    for (unsigned int i=0; i<vec_thr.size(); ++i) 
    { 
     vec_thr.at(i).join(); 
    } 
    return 0; 
} 
3

Integer i hat kein joinable Member-Funktion (oder jede Memberfunktion als es sich um eine primitiver Typ). Es sollte sein:

for (unsigned int i=0; i<vec_thr.size(); ++i) 
{ 
    if (vec_thr[i].joinable()) 
     vec_thr.at(i).join(); 
} 

Oder nur join auf dem Thread verwenden. Ich sehe keinen besonderen Grund zu tun joinable Test hier, wie Sie nicht detaching einer der Threads sind.

+0

Entschuldigung. Das war ein Tippfehler. Ich hatte das verbindbare Teil kommentiert ... nicht sicher, wann es gelöscht wurde ... // ~ if (i.joinable()) – AJES123

+0

Ok, also, wenn das nicht das Problem war, kannst du die Frage auch aktualisieren die Fehlermeldung, die Sie in diesem Fall erhalten, posten? – Arunmu

+0

/usr/include/c++/4.8/tuple:135:25: Fehler: Verwendung der gelöschten Funktion 'std :: unique_ptr <_Tp, _Dp> :: eindeutige_ptr (const std :: unique_ptr <_Tp, _Dp> &) [mit _Tp = Client; _DP = std :: default_delete ] : _M_head_impl (__ h) {} ^ In-Datei von /usr/include/c++/4.8/memory:81:0 enthalten, von /usr/include/c++/4.8/ Thread: 40, von src/DataEngine.h: 31, von src/DataEngine.cpp: 24: /usr/include/c++/4.8/bits/unique_ptr.h:273:7: Fehler: hier deklariert unique_ptr (const unique_ptr &) = löschen; ^ – AJES123