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.
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:
Stattdessen sollten Sie es wie folgt verwenden:
%Vor%Tags und Links c++ multithreading reference vector