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'.
Que voulez-vous dire par « accidents "? Signale une erreur interne du compilateur? –
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. –
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