2017-03-24 4 views
1

Ich habe den folgenden Code als meine Hauptfunktion:Wie kann ich eine Funktion mehrmals gleichzeitig ausführen lassen?

int main(int argc,char** argv) 
{ 
    CommandLineParser cmd(argc,argv,keys); 
    if (cmd.has("help")) { 
     cmd.about(""); 
     cmd.printMessage(); 
     return 0; 
    } 
    String alphaFile = cmd.get<String>("alpha"); 
    String betaFile = cmd.get<String>("beta"); 
    String gammaFile = cmd.get<String>("gamma"); 
    String deltaFile = cmd.get<String>("delta"); 
    int featureToUse = cmd.get<int>("feature"); 
    int classifier = cmd.get<int>("classifier"); 

    runOnSingleCamera(alphaFile, featureToUse, classifier); 
    runOnSingleCamera(betaFile, featureToUse, classifier); 
    runOnSingleCamera(gammaFile, featureToUse, classifier); 
    runOnSingleCamera(deltaFile, featureToUse, classifier); 

    return 0; 
} 

runOnSingleCamera ist eine meiner anderen Funktionen, und jeder Anruf läuft die gleiche Sache auf verschiedene Video-Dateien. Der Code muss für alle Videodateien gleichzeitig ausgeführt werden und auf dasselbe globale Array zugreifen.

Was wäre der beste Weg, dies zu tun?

Wenn die Lösung Multithreading ist, geben Sie bitte an, was in meiner cmake-Datei enthalten sein sollte, da ich damit experimentiert habe, es aber nicht zum Laufen bringen konnte.

+1

Siehe die Beispiele für 'std :: thread' http://en.cppreference.com/w/cpp/thread/thread/thread –

Antwort

2

Wie wäre es damit:

int main(int argc,char** argv) 
{ 
    CommandLineParser cmd(argc,argv,keys); 
    if (cmd.has("help")) { 
     cmd.about(""); 
     cmd.printMessage(); 
     return 0; 
    } 
    String alphaFile = cmd.get<String>("alpha"); 
    String betaFile = cmd.get<String>("beta"); 
    String gammaFile = cmd.get<String>("gamma"); 
    String deltaFile = cmd.get<String>("delta"); 
    int featureToUse = cmd.get<int>("feature"); 
    int classifier = cmd.get<int>("classifier"); 

    std::thread t1(runOnSingleCamera, alphaFile, featureToUse, classifier); 
    std::thread t2(runOnSingleCamera, betaFile, featureToUse, classifier); 
    std::thread t3(runOnSingleCamera, gammaFile, featureToUse, classifier); 
    std::thread t4(runOnSingleCamera, deltaFile, featureToUse, classifier); 

    t1.join(); 
    t2.join(); 
    t3.join(); 
    t4.join(); 

    return 0; 
} 

Multithreading ist kein Spielzeug though. Wenn hier alles unabhängig ist, dann ist das in Ordnung. Wenn Variablen in irgendeiner Weise voneinander abhängen, müssen Sie vorsichtig sein.

Wenn Ihr Array schreibgeschützt ist, ist dies in Ordnung. Wenn Ihr Array von allen Threads geändert werden muss, ist dies ein Zerstörungsrezept. Seien Sie wieder vorsichtig mit Shared Variablen unter Threads. Es ist ein sehr großes Thema. Lesen Sie über race-conditions.

Beachten Sie, dass damit alles nach Wert übergeben wird; d. h., alles wird in Ihre Funktion kopiert (auch wenn Ihre Funktion durch Verweis darauf Bezug nimmt). Sie sollten std::ref() als Referenz verwenden. Lesen Sie mehr über std::thread here.

+0

Dies ist, was ich gemeint habe, als ich sagte, dass ich Multithreading nicht bekommen konnte Arbeit, Entschuldigung für mangelnde Klarheit, bekomme ich den folgenden Fehler: – TomRobson

+0

/usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: undefined Verweis auf Symbol 'Pthread_create @@ GLIBC_2.2.5' // lib /x86_64-linux-gnu/libpthread.so.0: Fehler beim Hinzufügen von Symbolen: DSO fehlt in der Befehlszeile collect2: Fehler: ld gab 1 Exit-Status zurück CMakeFiles/main.dir/build.make: 163: Rezept für Ziel 'main 'fehlgeschlagen make [2]: *** [main] Fehler 1 CMakeFiles/Makefile2: 67: Rezept für Ziel' CMakeFiles/main.dir/all 'fehlgeschlagen make [1]: *** [CMakeFiles/main.dir/all] Fehler 2 Makefile: 83: Rezept für Ziel 'alle' fehlgeschlagen make: *** [alle] Fehler 2 – TomRobson

+0

@TomRobson Sie müssen auf Pthread verlinken . Link mit dem Flag '-thread'. Sie können 'target_link_libraries' in cmake verwenden, um dies zu erreichen. Zum Beispiel 'target_link_libraries (MyExec -pthread)'. Ersetzen Sie 'MyExec' durch Ihr Objekt in cmake. –

Verwandte Themen