Kurzfassung meiner Frage:
Dieser Code bringt den Compiler zum Absturz.
pThread[0] = new boost::thread(
boost::bind(
&cGridAnimator::DoJob, // member function
this ), // instance of class
0 ); // job number
Der Compiler stürzt ab, wenn er versucht, diesen Code zu kompilieren. (Es ist nicht mein Programm, das abstürzt, wenn ich diesen Code ausführe!)
Was muss repariert werden?
Langfassung der Frage
Ich teile die Arbeit an einem großen 3D-Gitter in 8 separate Aufträge auf, die in separaten Threads ausgeführt werden sollen, um die Vorteile einer 8-Kern-Maschine zu nutzen.
Das funktioniert perfekt:
JOB_LOOP {
pThread[kjob] = new boost::thread( ::DoJob, kjob );
}
Die globale freie Funktion DoJob liest die Daten aus einer globalen Instanz von cGridAnimator, entsprechend der Jobnummer.
Ich mag jedoch nicht, dass all diese Globals im Umlauf sind, und ich mag es nicht, so viele Accessor-Methoden verwenden zu müssen, um an die benötigten Daten zu gelangen. Es wäre viel aufgeräumter, eine Methode von cGridAnimator zu verwenden.
Daher der Code am Anfang dieser Frage.
Wenn ich es jedoch mit MSVC++ 2008 kompiliere, gibt der Compiler die folgenden Beschwerden aus und stürzt dann ab.
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'.