Thread-Funktion mit übergebenem Referenzvektor ist langsam zu starten

8

Ich habe C ++ 0x Themen angeschaut und habe diesen Code:

%Vor%

Wie Sie sehen können, übergibt es einfach einen Vektor an einen Thread. Was ich nicht verstehe ist, dass es eine Pause gibt, nachdem die Nachricht "V erstellt" erscheint. Ursprünglich wurde (wie ich annahm) der Vektor für die Verwendung in der Funktion kopiert. Um das zu stoppen, ging ich stattdessen durch Verweis, aber das machte keinen Unterschied.

Die Verzögerung scheint proportional zur Größe des Vektors zu sein, was anzeigt, dass er immer noch kopiert (oder etwas mit dem Array macht). Wenn ich das gleiche Experiment ohne Threads versuche und nur die Funktion direkt aufrufen, dann ist die Verzögerung bei der Übergabe nach Wert, aber nicht bei der Referenzübergabe wie erwartet.

Ich habe das gleiche mit Boost-Threads anstelle von C ++ 0x versucht (obwohl ich gelesen habe, dass sie sehr ähnlich sind) und habe das gleiche Ergebnis erhalten.

Gibt es einen Grund für dieses Verhalten oder habe ich etwas offensichtlich übersehen? Danke.

Entschuldigung, habe den falschen Testcode gepostet. Korrigiert. Bearbeiten: Hinzugefügt enthält wie gewünscht.

Kompiliert mit: g ++ 44 -std = c ++ 0x -lpthread tester.cpp -o test ... wie ich GNU 4.4 neben dem Standard-GNU-Compiler installiert habe, der mit meinem Linux (CentOS) geliefert wird, das C ++ 11 nicht unterstützt.

    
Columbo 28.11.2011, 11:46
quelle

2 Antworten

17

Ich spekuliere nur, da Sie die Version des Codes, der Threads verwendet, nicht gepostet haben, aber ich vermute, dass Ihr Problem darin besteht, dass std::bind (oder boost::bind ) standardmäßig Kopien von allen erstellt Argumente, die Sie binden. Um dies zu vermeiden, können Sie std::ref oder std::cref verwenden.

Um dies zu konkretisieren, verwenden Sie bind wahrscheinlich so:

%Vor%

Stattdessen sollten Sie es wie folgt verwenden:

%Vor%     
Martin B 28.11.2011, 12:02
quelle
-1

Wo sind die Fäden hier? Es sieht so aus, als ob die for -Schleife die Verzögerung verursacht, auf die Sie sich beziehen. Nichts Ungewöhnliches hier - da Sie einen Vektor der Größe 200000000 zuweisen.

    
omggs 28.11.2011 12:02
quelle