Ich habe eine for-Schleife ein std::vector
von std::future
zu definieren meine Funktion vector<int> identify
und eine weitere Schleife auszuführen, um die Ergebnisse zu erhalten, durch den Aufruf std::future::get()
wie folgt:Beginnt ein Thread wirklich, nachdem std :: future :: get() aufgerufen wurde?
for (int i = 0; i < NUM_THREADS; ++i) {
VecString::const_iterator first = dirList.begin() + i*share;
VecString::const_iterator last = i == NUM_THREADS - 1 ? dirList.end() : dirList.begin() + (i + 1)*share;
VecString job(first, last);
futures[i] = async(launch::async, [=]() -> VecInt {
return identify(i, job, make_tuple(bIDList, wIDList, pIDList, descriptor), testingDir, binaryMode, logFile, logFile2);
});
}
int correct = 0;
int numImages = 0;
for(int i = 0; i != NUM_THREADS; ++i) {
VecInt ret = futures[i].get();
correct += ret[0];
numImages += ret[1];
}
Der Job ist es, einige Bilder und ich teile die Arbeit zu verarbeiten ungefähr gleich zwischen jedem Faden. Ich bette auch std::cout
in die Funktion ein, um anzuzeigen, aus welchem Thread die Ergebnisse stammen.
Ich gehe davon aus, dass nach dem ersten Thread seine Arbeit beendet hat, andere auch ihre vervollständigt sollte und die Schleife wird die Ergebnisse aus drucken. Nach dem Ende des ersten Threads funktionieren jedoch noch andere Threads. Ich denke, dass sie wirklich funktionieren, nicht nur die Ergebnisse ausdrucken, weil es eine gewisse Verzögerung gibt, wenn die Funktion ein großes Bild verarbeitet. Das lässt mich fragen, wann die Fäden wirklich anfangen.
Ich weiß aus der Dokumentation, die jeder Thread nach seiner Initialisierung beginnt sofort, aber wie kann man meine Beobachtung erklären? Vielen Dank und jede Hilfe ist viel
Bitte senden Sie eine [MCVE] – Jonas
i hinzugefügt meinen Code-Snippet für Klarheit . –
Mein erster Gedanke ist, dass Ihr Cout in einem Puffer kommen kann und nicht direkt gedruckt wird. Versuchen Sie, eine Zeit/Uhr auszudrucken, um sicher zu sein, wenn es startet, darüber hinaus bin ich nicht vertraut mit Threads. – turoni