it-swarm.com.de

Übergeben von Lambdas an std :: thread und Aufrufen von Klassenmethoden

Ich habe Probleme mit std :: thread zusammen mit Lambdas. Ich habe eine Methode TheMethod, bei der ich std :: thread verwenden sollte, um einige Funktionsaufrufe mit Methoden in derselben Klasse zu parallelisieren.

Ich definiere eine Lambda-Funktion und versuche, sie wie folgt an die von mir erstellte std :: thread-Instanz zu übergeben:

auto functor = 
   [this](const Cursor& c, size_t& result) ->void {result = classMethod(c);};

size_t a;
Cursor cursor = someCursor();

std::thread t1(functor, cursor, a);

t1.join();

Leider gibt mir der Compiler:

  /usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<TheMethod...

Ich habe viele Kombinationen in der Lambda-Definition ausprobiert und den std :: thread-Konstruktor aufgerufen, aber ich bekomme immer denselben Fehler. Die Thread-Bibliothek ist enthalten, ich verlinke auch Pthread.

Danke für Hinweise!

13
user46317

Sie können std :: ref verwenden, um die Parameter als Referenz zu übergeben:

std::thread t1(functor, std::ref(cursor), std::ref(a))

Sie können die Parameter auch per Referenz im Lambda selbst erfassen:

size_t a;
Cursor cursor = someCursor();
std::thread t1([&] {a = classMethod(cursor);});
t1.join();
14
alexk7

Dies liegt daran, dass die Objekte Cursor und a per Wert an den Konstruktor von thread übergeben werden. Der Functor nimmt einen Verweis auf die lokalen Kopien des neu erstellten Threads und nicht auf die Objekte, von denen Sie erwarten, dass sie es erwarten.

Daher sollten Sie, wie von "alexk7" geantwortet, std :: ref verwenden, oder wenn Sie sie per Referenz erfassen möchten

0
sarup dalwani