2017-01-12 4 views
-1

Imaginez un tel code, qui crée la fonction lambda et le passe à un autre thread à exécuter (méthode schedule_task_in_thread attendez Functor comme seul paramètre). Que se passe-t-il exactement à l'objet o? Y at-il une copie temporaire créée jusqu'à l'exécution de la méthode ? Le wait() s'assure que l'appel est bloqué.Objet passé en pointeur de fonction vers un autre thread - comment est-il géré?

#define INVOKE_IN_MYTHREAD(method_name, ...) \ 
       return schedule_task_in_thread([&](){ return mythread->method_name(__VA_ARGS__); }).wait(). 

    void do_something(MyObject o){ 
     INVOKE_IN_MYTHREAD(method, o); 
    } 

Le problème est que la méthode de mythread->() rapporte l'objet o soit légèrement différent de ce qu'il était en do_something(). J'ai essayé d'attraper tout {copy | default | move} {constructeur | affectations} mais je ne les vois pas être appelés.

class MyObject{ 
    uint32_t a; 
    std::string b; 
    CryptoPP::Integer c; 
} 

Fields un et b sont transmis correctement, le champ c est réglé sur Integer (0). Des idées?

+0

S'il vous plaît fournir un (http://stackoverflow.com/help/mcve) [MCVE] – tkausl

+0

va essayer de créer un, mais cela est assez complexe environnement , donc ça va prendre du temps. – ejossev

Répondre

0

Votre lambda est une référence qui capture tous les arguments de la méthode, et ces références ne sont valides que si le thread appelant se trouve dans le corps de do_something.

Si vous avez plutôt la capture lambda par valeur, il y aura une copie.

plus sûr que votre macro serait quelque chose comme

template <typename Method, typename ... Args> 
void invoke_in_mythread(Method method, Args ... args) 
{ 
    schedule_task_in_thread([=](){ return mythread->method(std::forward<Args...>(args)); }).wait(); 
} 
+0

Merci, je vais essayer aussi. Toutefois, l'appel est bloqué (puisque wait() attend que la méthode soit planifiée et exécutée), le programme ne laissera pas la méthode do_something() jusqu'à ce que mythread-> soit terminé. Ce n'est pas le problème. – ejossev