Je me sens confus au sujet de la référence en tant que paramètres lors de l'utilisation de la bibliothèque de threads, voici le code :

#include "../include.h"  // include some header file
class A { 
 public:
  A(unordered_map<int, int>& m) : m(m) {  
  }
  void Start() {
    std::thread(test1, m); 
  }
 private:
  static void test1(unordered_map<int, int>&  m) {  // complie failed, if the ref change to value(remove &), it's ok, thats confused me
    for (auto i : m) {
      cout << i.first << i.second << endl;
    }   
  }
  unordered_map<int, int> & m;
};

int main() {
  unordered_map<int, int> m = {{1,2}, {3,4}};
  A a(m);
  a.Start();
}

Quand je laisse les paramètres de test1 être ref, cela échoue et sort beaucoup de msg:

In file included from /usr/include/c++/4.8.2/thread:39:0,
                 from ./../include.h:6,
                 from ./test@classref.cpp:1:
/usr/include/c++/4.8.2/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::unordered_map<int, int>))(std::unordered_map<int, int>&)>’:
/usr/include/c++/4.8.2/thread:137:47:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::unordered_map<int, int>&); _Args = {std::unordered_map<int, int, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, int> > >&}]’
./test@classref.cpp:10:25:   required from here
/usr/include/c++/4.8.2/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::unordered_map<int, int>))(std::unordered_map<int, int>&)>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c++/4.8.2/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::unordered_map<int, int>))(std::unordered_map<int, int>&)>’
         _M_invoke(_Index_tuple<_Indices...>)
         ^

Mais bon si les paramètres ont de la valeur, je ne connais pas la différence, quelqu'un peut-il m'aider à ce sujet ?

Y a-t-il des choses spéciales que je ne sais pas sur les paramètres de la fonction de thread? Merci beaucoup.

0
nick huang 20 nov. 2019 à 18:27

1 réponse

Meilleure réponse

Depuis cppreference,

Les arguments de la fonction thread sont déplacés ou copiés par valeur. Si un argument de référence doit être passé à la fonction thread, il doit être encapsulé (par exemple avec std::ref ou std::cref).

Donc,

  void Start() {
    auto t = std::thread(test1, std::ref(m)); 
    t.join(); // so it waits for the thread to finish printing for your example.
  }

Démo

2
rmawatson 20 nov. 2019 à 16:00