2009-08-21 5 views
2

Brève version de ma question:boost: thread se bloque compilateur C++ microsoft

Ce code bloque le compilateur.

pThread[0] = new boost::thread(
boost::bind(
    &cGridAnimator::DoJob, // member function 
     this),     // instance of class 
     0);     // job number 

Le compilateur se bloque lors de la tentative de compilation de ce code. (Ce n'est pas mon programme qui crashe quand je lance ce code!)

Qu'est-ce qui doit être réparé?


Version longue de la question

Je partage le travail sur une grande grille 3D en 8 emplois distincts à exécuter dans les discussions séparées, de manière à tirer parti d'une machine 8 de base.

Cela fonctionne parfaitement:

La DoJob fonction globale sans lit les données d'une instance globale de cGridAnimator, en fonction du nombre d'emplois.

Cependant, je n'aime pas tous ces globaux flottant, et je n'aime pas avoir à utiliser autant de méthodes d'accès pour obtenir les données nécessaires. Il serait beaucoup plus ordonné d'utiliser une méthode de cGridAnimator.

D'où le code en haut de cette question.

Cependant, lorsque je le compile sur MSVC++ 2008 le compilateur émet les plaintes suivantes, puis se bloque.

1>Compiling... 
1>mfm1.cpp 
1>C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1643) : warning C4180: qualifier applied to function type has no meaning; ignored 
1>  C:\Program Files\boost\boost_1_38_0\boost/bind.hpp(1677) : see reference to class template instantiation 'boost::_bi::add_cref<Pm,I>' being compiled 
1>  with 
1>  [ 
1>   Pm=void (__thiscall cGridAnimator::*)(int), 
1>   I=1 
1>  ] 
1>  .\mfm1.cpp(158) : see reference to class template instantiation 'boost::_bi::dm_result<Pm,A1>' being compiled 
1>  with 
1>  [ 
1>   Pm=void (__thiscall cGridAnimator::*)(int), 
1>   A1=cGridAnimator * 
1>  ] 
1>C:\Program Files\boost\boost_1_38_0\boost/mem_fn.hpp(318) : warning C4180: qualifier applied to function type has no meaning; ignored 
1>  C:\Program Files\boost\boost_1_38_0\boost/bind/bind_template.hpp(344) : see reference to class template instantiation 'boost::_mfi::dm<R,T>' being compiled 
1>  with 
1>  [ 
1>   R=void (int), 
1>   T=cGridAnimator 
1>  ] 
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe'. 
+0

Que voulez-vous dire par « accidents "? Signale une erreur interne du compilateur? –

+2

Je ne vois pas de "crash du compilateur" ici. Je ne vois même pas une erreur de compilation! Tout ce que vous obtenez sont 2 avertissements du compilateur C++, puis une erreur de 'vcbuild'. Je soupçonne fortement que vous 1) êtes en train de compiler avec/W4, et 2) avez des erreurs dans votre fichier '.vcproj'. S'il vous plaît montrer le fichier de projet. La signature de 'cGridAnimator :: DoJob()' serait également utile. –

+0

Vous avez raison sur cette partie. Un ICE est généralement imprimé dans le journal de construction, et un plantage d'application n'entraîne généralement pas errorlevel = 1 ... Dumb me. – gimpf

Répondre

3

Modifier le code dans:

pThread[0] = new boost::thread(boost::bind(&cGridAnimator::DoJob, this, 0)); 

Ce code donne une fonction void (void) au fil au lieu d'une fonction void (int) et un argument supplémentaire.

+0

Cela résout le crash du compilateur. Je vais faire quelques tests, et si cela fonctionne accepter cette réponse. – ravenspoint

+0

Belle prise! Comme la réponse est affirmée comme cela serait si évident: Comment avez-vous trouvé cela? – gimpf

+1

Vous pouvez voir la signature de DoJob dans le message d'avertissement. J'ai le même compilateur plante presque chaque fois que le nombre d'arguments ne correspond pas. – Willy

2

Il n'y a pas de réponse définitive; Fondamentalement, un ICE est toujours une bonne raison de contacter le fournisseur du compilateur.

Pour trouver la cause réelle, il sera utile d'essayer de trouver le programme minimal qui présente encore le crash. Cela signifie supprimer autant de code que possible, supprimer autant de dépendances que possible, etc. etc. Pour une ICE, j'ai déjà eu du succès avec le lancement d'un nouveau projet, et j'ai juste écrit les cinquante lignes de code où je soupçonnais le problème .

solutions de contournement Après m'a aidé dans le passé:

  1. réduire le niveau d'optimisation
    • génération de code lien en particulier le temps semble être un peu fragile
  2. de commande de changement d'inclure des fichiers
    • seulement sensible si vous connaissez la révision de la source quand il a cessé de fonctionner, de sorte que vous pouvez vous concentrer sur les changements il
  3. passer à une version de boost différent
    • l'auteur de la bibliothèque Boost peut avoir activé une solution de contournement, ou le code juste assez changé pour ne pas provoquer une ICE plus.
0

Avis si vous utilisez boost :: bind, et le type de paramètre est faux, Visual Studio ne vous rappellera pas cette erreur, mais une erreur PRJ0002 et cl.exe