2017-03-07 3 views
-2

Je suis novice en threading C++. J'ai développé une application multi-thread en C++ 11 en utilisant des blocs Code:.L'exécution de thread diffère-t-elle dans IDE et comme application exe en C++?

L'application semble fonctionner et fonctionner parfaitement (démarrer le programme, diviser la tâche en threads, à la fin de la tâche, puis imprimer les informations, puis quitter) à partir des blocs de code. Mais après avoir généré le fichier exe en utilisant les blocs de code, et en exécutant le fichier exe séparément de la ligne de commande, le programme fonctionne comme avant jusqu'à ce que la tâche soit terminée, mais à la fin de toute la tâche, les threads ne parviennent pas à quitter passez à l'étape suivante.

L'exécution du programme dans le code: blocks et outside doit être identique. J'ai ajouté la fonction de tâche de division ci-dessous qui exécute la fonction filetée. J'ai utilisé le moodycamel::ConcurrentQueue pour la fonction ci-dessous.

void divide_task(){ 
    std::atomic<int> doneConsumers(0); 
    std::thread threads[cores_aval]; 
    for (int i = 0; i != cores_aval; ++i) { 
     threads[i] = std::thread([&]() { 
      Item* item = new Read; 
      do{ 
       while (con_read_q.try_dequeue(item)) { 
        //do something with hitem; 
        delete item; 
       } 
      } 
      while (doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == cores_aval); 
     }); 
    } 
} 

Mise à jour: Merci pour les réponses. J'ai trouvé le problème avec les paramètres d'option de construction dans les blocs de code. L'un des drapeaux du compilateur dans la branche de publication affectait le fichier exe final, qui réduisait la taille du fichier en supprimant les symboles.

+1

Il y a peut-être un défaut dans votre code. [Mcve] –

+0

Votre code est incomplet; en particulier, il semble manquer une fonction 'main()' et au moins un '# include'. S'il vous plaît [modifier] votre code c'est un [mcve] de votre problème, alors nous pouvons essayer de le reproduire et de le résoudre. Vous devriez aussi lire [ask]. –

Répondre

0

La synchronisation entre les threads est probablement différente lors de l'exécution dans l'EDI et à l'extérieur, ce qui pourrait exposer les conditions de course plus facilement dans un environnement par rapport à l'autre.

La construction avec/sans optimisation modifiera également les temps et peut également exposer des bogues.

Dans tous les cas, sans un SSCCE il est impossible de dire ce qui ne va pas dans votre cas, mais ma boule de cristal dit que vous avez probablement une course de données dans votre code.

Etes-vous sûr que ce while (con_read_q.try_dequeue(item) est thread-safe?

+0

Oui, je comprends. Je n'ai pas de condition de course car je charge d'abord toutes les données qui doivent être traitées et ensuite l'étape de traitement commence. La file d'attente contient toutes les données dont elle a besoin avant que la méthode divide_task ne soit appelée. Moodycamel :: ConcurrentQueue possède la fonction try_dequeue (item) qui est une fonction thread-safe. – Balaram26