2017-03-20 1 views
2

J'ai quelques difficultés à comprendre l'utilisation correcte d'un objet fonctionnel en tant que routine de thread dans C++ STL. D'après ce que je comprends, un des avantages d'un foncteur est que l'instance d'objet peut maintenir l'état. Il y a des moments où je veux qu'un ou plusieurs threads exécutent une routine et calculent un résultat. Je demande ensuite ces résultats à partir des objets après avoir rejoint les threads. J'essaie de faire la même chose avec les threads C++ STL et de rencontrer quelques problèmes. Il semble que le problème provient du fait que le thread STL C++ fait une copie de mon objet et donc je ne suis pas sûr de la façon dont je suis censé aller inspecter les résultats lorsque je rejoins les threads. Voici un extrait du code:Utilisation correcte du foncteur pour le thread STL C++

#include <iostream> 
#include <thread> 

using namespace std; 

class Worker 
{ 
public: 
    Worker() : _value(0) 
    { 
    } 

    void operator()(unsigned int value); 

    unsigned int get_value() {return this->_value;} 

private: 
    unsigned int _value; 
}; 

void Worker::operator()(unsigned int value) 
{ 
    this->_value = value; 
} 

int main() 
{ 
    Worker worker; 
    thread thread(worker, 13); 
    thread.join(); 
    unsigned int value = worker.get_value(); 
    cout << "value: " << value << endl; 
} 

L'exemple ci-dessus est un simple repro du problème que je suis en cours d'exécution dans. Je m'attendrais à ce que worker.get_value() retourne 13 mais il retourne zéro. Comment faire pour instancier un objet avec l'état, avoir un thread exécuter une routine dans cet objet, puis interroger l'état de cet objet une fois le thread terminé?

Merci, Nick

Répondre

3

Lorsque vous passez par la valeur que vous faites une copie. Ainsi, vous pouvez passer par référence par emballage de référence:

thread thread(std::ref(worker), 13); 

ou passer par le pointeur:

thread thread(&worker, 13); 

dans les deux cas, vous devez vous assurer que la vie de l'objet est assez long.

1

Ne faites pas une copie, mais se lient à la place le fil à une référence:

thread thread(std::ref(worker), 13); 
//   ^^^^^^^^ 
+0

[Démo] (http://melpon.org/wandbox/permlink/hLi31ibs7nc3VqnK) –