2017-05-09 3 views
0

Ich erstelle ein Multithread-System mit OpenCV, das einige Bilder erstellt, sie einem Vektor zuordnet und jedes Bild in einen anderen Thread sendet.OpenCV-Matrix einer Datenstruktur zuweisen

Dies ist, wie es aussieht:

std::vector<cv::Mat> images; 
for (int i = 0 ; i < 10 ; i++) { 
    images.push_back(cv::Mat(/* bla bla */)); 
    cv::Mat& mat = images.back(); 
    std::thread(some_function_name, &mat) 
} 
// Wait here for all threads to join (didn't show its code) 

Es scheint, dass, wenn der Thread bekommt den Zeiger auf das Mat Objekt, das Mat Objekt nicht mehr existiert. Ist es möglich, dass es, obwohl es dem Vektor sofort zugewiesen wurde, tatsächlich zerstört wurde, als die Schleife endete, als es vom Stapel gelöscht wurde?

Antwort

2

Ihr Problem ist eigentlich die Tatsache, dass Sie push_back in der Schleife aufrufen, die Neuzuweisungen verursachen kann. In diesem Fall werden die zugrunde liegenden Daten kopiert, sodass alle Zeiger oder Verweise ungültig werden.

Um dies zu lösen, wäre eine Möglichkeit, die Anordnung vor der Zeit

std::vector<cv::Mat> images(10); 
for (int i = 0 ; i < 10 ; i++) { 
    images[i] = cv::Mat(/* bla bla */); 
    cv::Mat& mat = images.at(i); 
    std::thread(some_function_name, &mat) 
} 
// Wait here for all threads to join (didn't show its code) 
+0

zu groß sein Sagen Sie eigentlich, dass die Selbst Erweiterung Operationen des 'VECTOR' die Ursache es von Zeit zu Zeit auftreten? Wenn ich stattdessen "std :: list" verwende, würde das verhindert werden? – SomethingSomething

+1

@SomethingSomething [Lesen Sie diesen Beitrag] (https://stackoverflow.com/questions/17299951/c-vector-what-happens-whene-re-expands-reallocate-on-stack) das erklärt, was passiert "unter der Haube" wenn Sie Elemente zu einem 'std :: vector' hinzufügen. Ja, Sie könnten eine 'std :: list' verwenden, um dies zu vermeiden, aber das würde nur das Problem vermeiden, es ist besser zu verstehen, * warum * das überhaupt vorkommt, damit Sie das Verhalten der verschiedenen Standardbibliotheken verstehen Behälter. – CoryKramer

+0

Gut, ich habe gelernt, in "Data Structures" Kurs gelernt, dass mit Amortized Analysis, wenn Sie den Vektor jedes Mal erweitern, wenn seine Größe ist (2^i), dann ist Ihre durchschnittliche Komplexität O (1) - und ich verstehe, es ist getan in C++ mit "realloc()" - das habe ich beim Schreiben meines Codes nicht so genau gedacht. Ich habe die Frage im letzten Kommentar gestellt, nur um sicherzustellen, dass Sie zu diesem spezifischen realloc – SomethingSomething

Verwandte Themen