2016-05-03 8 views
-2

Ich habe ein Array von Threads und in for Schleife sollte ich einen Thread für alle von ihnen erstellen.Nehmen Sie mehrere Argumente an die Thread-Funktion C++ 11

Das Problem ist, dass einer der Parameter std::move(promise_var) ist und eine andere Struktur ist. Wenn ich versuche, es zu kompilieren zu kompilieren gibt mir eine Fehlermeldung:

error: no matching function for call to ‘ std::thread::thread(void (&)(Function), Structure [nNumThreads], std::remove_reference<std::promise<const char*>&>::type)

So, hier ist die vereinfachte Version von Code ...

func(struct Structure, std::promise<const char *> && v_Promise){ 
//doing work 
} 

main(){ 
std::thread a_Threads[5]; 

for(int8_t i = 0; i < 5; i++){ 
    a_Threads[i] = std::threads(func, Structure, std::move(v_promise[i])); 
} 
} 
+0

Ich bin mir nicht sicher, ob Sie tun können, was Sie wollen, aber ich glaube nicht, dass Sie sowieso wollen. In Ihrer Schleife bewegen Sie das gleiche Objekt in jeden Thread. Nach der ersten Iteration sollte 'v_promise' nicht mehr verwendet werden, da sein Inhalt in den Thread verschoben wurde. – NathanOliver

+1

Wenn 'func' einen rvalue-Verweis auf ein' std :: promise 'nimmt, heißt das, dass es wahrscheinlich von" v_promise "wechselt und" v_promise "in einem nicht angegebenen, möglicherweise unbrauchbaren Zustand verlässt. Wie kann jeder Thread in diesem Fall das gleiche Objekt verwenden? Erstellen Sie entweder 5 'v_promise's oder verwenden Sie eine lvalue-Referenz – KABoissonneault

+0

Natürlich können Sie Multi-Arg-Threading-Funktionen verwenden. Der Code hat jedoch ein Problem, das oben erwähnt wurde, und es ist sowieso nicht vollständig. – SergeyA

Antwort

2

(nicht in einem Kommentar setzen, so dass ich die anhängen Code richtig) abgeschlossen ich den Code, den Sie so vor, dass es kompiliert und ich kann bestätigen, dass der folgende Code kompiliert und läuft gut mit dem Befehl g++ test.cpp -std=c++11 -pthread:

#include <iostream> 
#include <thread> 
#include <future> 

using namespace std; 

struct Structure{ 
int el1; 
int el2; 
}; 

void func(struct Structure, std::promise<const char *> && v_Promise){ 
    cout<<"Hello"<<endl; 
    //doing work 

} 

int main(){ 
    std::thread a_Threads[5]; 
    Structure my_struct; 
    std::promise<const char*> v_promise; 

    for(int8_t i = 0; i < 5; i++){ 

     a_Threads[i] = std::thread(func, my_struct, std::move(v_promise)); 

    } 
} 

Bitte Querverweis diese gegen Tippfehler oder Informationen, die Sie möglicherweise weggelassen haben.

+0

Dieser Code funktionierte auf Ihrer Maschine? –

+0

Ja, mit beiden clang ++ (3.8) und g ++ (4.9), druckt es hallo ein paar Mal. – nikaza

+0

Sind Sie sicher, dass func als void deklariert ist? – nikaza

Verwandte Themen