web-dev-qa-db-fra.com

Passer lambdas à std :: thread et appeler des méthodes de classe

J'ai un peu de mal à utiliser std :: thread avec lambdas. J'ai une méthode TheMethod où je devrais utiliser std :: thread pour paralléliser des appels de fonction à des méthodes de la même classe.

Je définis une fonction lambda et essaie de la transmettre comme suit à l'occurrence std :: thread que je crée:

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();

Malheureusement, le compilateur me donne:

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

J'ai essayé beaucoup de combinaisons dans la définition de lambda et dans l'appel du constructeur std :: thread, mais j'obtiens toujours la même erreur. La bibliothèque de threads est incluse, je lie aussi pthread.

Merci pour les conseils!

13
user46317

Vous pouvez utiliser std :: ref pour transmettre les paramètres par référence:

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

Vous pouvez également capturer les paramètres par référence dans le lambda lui-même:

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

Cela est dû au fait que les objets curseur et a sont passés par valeur au constructeur de thread. Le foncteur prend une référence aux copies locales du nouveau thread créé et non aux objets que vous espériez.

Par conséquent, comme l'a répondu "alexk7", vous devez utiliser std :: ref ou si vous souhaitez les capturer, passez-les par référence.

0
sarup dalwani