Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur lors de la création de thread

C2672-'invoke' : fonction correspondante surchargée introuvable

    18 juillet 2023 à 10:14:37

    Bonjour,

    Je développe un programme me permettant de calculer la distance vectorielle entre un vecteur d'entrée et une base de vecteurs de référence. Après test séquentiel, l'algorithme fonctionne très bien.

    Maintenant, j'essaie de paralléliser le traitement pour le rendre plus rapide avec le code ci-dessous:

    void Base::piloterCalculThreads(const std::vector<double>& vecteur, std::vector<ResultDistance>& resultat) {
    	std::vector<std::thread> pool;
    	int debut, fin, itePosition = 0;
    	//std::pair<int, int> unePair;
    	for (int i = 0; i < nbThreadsMachine; i++) {
    		itePosition = 2 * i;
    		debut = positions.at(itePosition);
    		fin = positions.at(itePosition+1);
    
    		pool.push_back(std::thread(&Base::calculerDistanceVecThreads, vecteur, resultat, debut, fin));
    		//pool.emplace_back(&Base::calculerDistanceVecThreads, this, vecteur, resultat, unePair.first, unePair.second);
    	}
    	for (int i = 0; i < nbThreadsMachine; i++) {
    		pool.at(i).join();
    	}
    	std::sort(resultat.begin(), resultat.end(), [](const ResultDistance& dist1, const ResultDistance& dist2) {
    		return dist1.distance < dist2.distance;
    	});
    	resultat.resize(30);
    }
    
    void Base::calculerDistanceVecThreads(const std::vector<double>& vecteur, std::vector<ResultDistance>& resultat, const int& debut, const int& fin) {
    	uint64_t comparaison;
    	uint16_t ident = 0;
    	double distance = 0.0;
    
    	//std::vector<double> aComparer = TabUtils::recopierTableauVersVecteur(vecteur);
    	//std::vector<ResultDistance> distances;
    
    	//for (Vecteur vecBase : base) {
    	for (int i = debut; i < fin; i++) {
    		Vecteur vecBase = base.at(i);
    		comparaison = TabUtils::comparerTailles(vecBase.retournerTaille(), vecteur.size());
    		distance = vecBase.calculerDistanceParam(vecteur, comparaison);
    		resultat.push_back(ResultDistance(vecBase.retournerIdentifiant(), distance));
    		ident++;
    	}
    }

    La fonction piloterCalculThreads définit les threads à lancer avec leur job. La fonction calculerDistanceVecThreads est à exécuter par le thread par récupération des paramètres. C'est lorsque j'ajoute cette fonction au job du thread avec ses paramètres qu'il me retourne l'erreur suivante:

    L'opération de génération a démarré...
    1>------ Début de la génération : Projet : TestsCalculDistance, Configuration : Release x64 ------
    1>Base.cpp
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Vecteur.h(27,1): warning C4267: 'return' : conversion de 'size_t' en 'int', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(15,46): warning C4267: 'initialisation' : conversion de 'size_t' en 'int', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(24,33): warning C4267: 'argument' : conversion de 'size_t' en '_Ty', perte possible de données
    1>        with
    1>        [
    1>            _Ty=int
    1>        ]
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(60,84): warning C4267: 'argument' : conversion de 'size_t' en 'const int', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(61,53): warning C4244: 'argument' : conversion de 'uint64_t' en 'const uint8_t', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(104,84): warning C4267: 'argument' : conversion de 'size_t' en 'const int', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(105,53): warning C4244: 'argument' : conversion de 'uint64_t' en 'const uint8_t', perte possible de données
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(43,14): error C2672: 'invoke' : fonction correspondante surchargée introuvable
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(49): message : voir la référence à l'instanciation de la fonction modèle 'unsigned int std::thread::_Invoke<_Tuple,0,1,2,3,4>(void *) noexcept' en cours de compilation
    1>        with
    1>        [
    1>            _Tuple=_Tuple
    1>        ]
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(55): message : voir la référence à l'instanciation de la fonction modèle 'unsigned int (__cdecl *std::thread::_Get_invoke<_Tuple,0,1,2,3,4>(std::integer_sequence<size_t,0,1,2,3,4>) noexcept)(void *) noexcept' en cours de compilation
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Base.cpp(80): message : voir la référence à l'instanciation de la fonction modèle 'std::thread::thread<void(__cdecl Base::* )(const std::vector<double,std::allocator<double>> &,std::vector<ResultDistance,std::allocator<ResultDistance>> &,const int &,const int &),const std::vector<double,std::allocator<double>>&,std::vector<ResultDistance,std::allocator<ResultDistance>>&,int&,int&,0>(_Fn &&,const std::vector<double,std::allocator<double>> &,std::vector<ResultDistance,std::allocator<ResultDistance>> &,int &,int &)' en cours de compilation
    1>        with
    1>        [
    1>            _Fn=void (__cdecl Base::* )(const std::vector<double,std::allocator<double>> &,std::vector<ResultDistance,std::allocator<ResultDistance>> &,const int &,const int &)
    1>        ]
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(39,5): error C2893: La spécialisation du modèle de fonction 'unknown-type std::invoke(_Callable &&,_Ty1 &&,_Types2 &&...) noexcept(<expr>)' a échoué
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\type_traits(1588): message : voir la déclaration de 'std::invoke'
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(39,5): message : Avec les arguments template suivants :
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(39,5): message : '_Callable=void (__cdecl Base::* )(const std::vector<double,std::allocator<double>> &,std::vector<ResultDistance,std::allocator<ResultDistance>> &,const int &,const int &)'
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(39,5): message : '_Ty1=std::vector<double,std::allocator<double>>'
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(39,5): message : '_Types2={std::vector<ResultDistance,std::allocator<ResultDistance>>, int, int}'
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\thread(39,5): error C2780: 'unknown-type std::invoke(_Callable &&) noexcept(<expr>)' : 1 arguments attendus - 5 fournis
    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.28.29333\include\type_traits(1582): message : voir la déclaration de 'std::invoke'
    1>TabUtils.cpp
    1>TestsCalculDistance.cpp
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Vecteur.h(27,1): warning C4267: 'return' : conversion de 'size_t' en 'int', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\TestsCalculDistance.cpp(20,15): warning C4244: 'argument' : conversion de 'time_t' en 'unsigned int', perte possible de données
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\TestsCalculDistance.cpp(34,15): warning C4244: 'argument' : conversion de 'time_t' en 'unsigned int', perte possible de données
    1>Vecteur.cpp
    1>C:\Users\x.bouchenard\Documents\dev\bibliotheques\TestsCalculDistance\TestsCalculDistance\Vecteur.h(27,1): warning C4267: 'return' : conversion de 'size_t' en 'int', perte possible de données
    1>VecUtils.cpp
    1>Génération du projet "TestsCalculDistance.vcxproj" terminée -- ÉCHEC.
    ========== Génération : 0 a réussi, 1 a échoué, 0 à jour, 0 a été ignoré ==========

    J'ai essayé tout ce qui me passait par la tête pour tenter de résoudre mais rien. J'ai également trouvé ce sujet mais ne m'a pas aidé:

    https://openclassrooms.com/forum/sujet/erreur-c2672-std-system-error-multi-threading

    Auriez-vous des idées ? Parce que là, je suis à sec de solutions ^^

    Je précise que c'est une erreur qui survient à la compilation.

    Merci beaucoup.

    -
    Edité par lespingoin 18 juillet 2023 à 13:59:23

    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2023 à 19:01:23

      Base::calculerDistanceVecThreads() est une fonction membre, elle a donc 'this' en premier paramètre caché.


      Sinon en regardant en diagonale, il semble y avoir des accès concurrents aux données dans calculerDistanceVecThread(), au moins sur le vector 'resultat'.

      • Partager sur Facebook
      • Partager sur Twitter

      Erreur lors de la création de thread

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown