Wie erstelle ich eine packaged_task mit Parametern?

7

Im Anschluss an dieses hervorragende Tutorial für Futures , verspricht und abgepackte Aufgaben Ich kam an den Punkt, an dem ich meine eigene Aufgabe vorbereiten wollte

%Vor%

Soweit ich die gcc-4.7.0 Fehlermeldung entziffern kann, erwartet sie die Argumente anders? Aber wie? Ich versuche die Fehlermeldung zu verkürzen:

%Vor%

Ist meine Variante, wie stelle ich die Parameter für ackermann falsch? Oder ist es der falsche Template-Parameter? Ich gebe die Parameter 3,11 nicht zur Erstellung des Threads, richtig?

Aktualisieren Sie andere fehlgeschlagene Varianten:

%Vor%

hmm ... bin ich es, oder ist es das Beta-GCC?

    
towi 25.09.2011, 20:44
quelle

2 Antworten

17

Erstens, wenn Sie std::packaged_task deklarieren, um Argumente zu übernehmen, müssen Sie sie an operator() übergeben, nicht an den Konstruktor. In einem einzigen Thread können Sie also tun:

%Vor%

Um dasselbe mit einem Thread zu tun, müssen Sie die Task in den Thread verschieben und die Argumente ebenfalls übergeben:

%Vor%

Alternativ können Sie die Argumente direkt binden, bevor Sie die Aufgabe erstellen. In diesem Fall hat die Aufgabe selbst jetzt eine Signatur, die keine Argumente enthält:

%Vor%

Sie können dies wiederum tun und an einen Thread übergeben:

%Vor%

Alle diese Beispiele sollten funktionieren (und tun dies sowohl mit g ++ 4.6 und MSVC2010 als auch mit meiner just :: thread Implementierung der Thread-Bibliothek). Wenn dies nicht der Fall ist, liegt ein Fehler im Compiler oder in der Bibliothek vor, die Sie verwenden. Zum Beispiel kann die Bibliothek, die mit g ++ 4.6 ausgeliefert wurde, nicht nur Objekte übergeben, die nur verschoben werden, wie zB std::packaged_task zu std::thread (und somit das zweite und vierte Beispiel nicht), da std::bind als Implementierungsdetail verwendet wird. und die Implementierung von std::bind erfordert inkorrekt, dass die Argumente kopierbar sind.

    
Anthony Williams 25.09.2011, 21:58
quelle
3

Da Sie den Thread ohne Argumente starten, erwarten Sie, dass die Aufgabe ohne Argumente gestartet wird, als ob task1() verwendet würde. Daher ist die Signatur, die Sie unterstützen möchten, nicht int(int, int) , sondern int() . Dies bedeutet wiederum, dass Sie einen Funktor, der mit dieser Signatur kompatibel ist, an den Konstruktor von std::packaged_task<int()> übergeben müssen. Probieren Sie:

%Vor%

Eine andere Möglichkeit ist:

%Vor%

, weil der Konstruktor von std::thread Argumente akzeptieren kann. Hier wird der Funktor verwendet, als ob task1(3, 11) verwendet würde.

    
Luc Danton 25.09.2011 20:53
quelle

Tags und Links