boost::thread / boost::bind
-
folgendes funktioniert unter windows mit mingw aber unter linux mit gcc nicht
//im konstruktor: boost::thread(boost::bind(&UCIControll::interpretString, this, input)); //die funktion sieht so aus void UCIControll::interpretString(string &str)
die fehlermeldung beim gcc:
g++ -c -pipe -Wall -W -O2 -pthread -o ucicontroll.o ucicontroll.cpp
ucicontroll.cpp: In constructorUCIControll::UCIControll(Engine*)': ucicontroll.cpp:12: error: no matching function for call to
boost::thread::
thread(void (UCIControll::)(std::string&), UCIControll const, std::string&
)'
/usr/include/boost/thread/thread.hpp:35: error: candidates are:
boost::thread::thread(const boost::thread&)
/usr/include/boost/thread/thread.hpp:38: error:
boost::thread::thread(const boost::function0<void,
std::allocatorboost::function_base >&)
/usr/include/boost/thread/thread.hpp:37: error:
boost::thread::thread()sollte boost::bind nicht ein boost::function0<void> zurückgeben?
kann mir irgendwer von den boost-experten sagen wie ich das machen muss wenns unter linux/macos/win laufen soll? ich will nur eine memberfunktion in einem thread starten.
-
*push*
kann mir denn keiner sagen wie ich mit boost eine memberfunktion in einem thread starte?
dann muss ichs mit pthread oder so probieren.
-
Und input ist etwas, an das man eine string& binden kann? (Also vor allem nicht const.)
Ansonsten würde ich mich lieber langsam an das Problem herantasten, als gleich so drastische Alternativen zu wählen; geht es, wenn du boost::bind aufrufst, ohne das Ergebnis zu verwenden?, usw.
-
Nabend,
hab auch grad mal in die Doku geschaut. Sollte eigentlich so funktionieren,
aber kannst ja auch mal die Variante mit boost::mem_fn probieren, obwohl das
eigentlich gleich dem Aufruf sein sollte, den du gepostet hast.Hmmm...waere so das, was ich aus dem Bauch heraus probieren wuerde.
mfg
v R
-
also das ganze läuft anstandslos unter windows. mingw gibt auch kein warning oder so heraus. ich hab mal noch ein bisschen rumprobiert:
boost::bind(&UCIControll::interpretString, this, input);
funktioniert, nur ein warning das es nicht benutzt wird.
boost::function0<void> test = boost::bind(&UCIControll::interpretString, this, input);
funktioniert.
boost::function0<void> test = boost::bind(&UCIControll::interpretString, this, input); boost::thread(test);
error:
ucicontroll.cpp:14: error: conflicting types for
boost::thread test' ucicontroll.cpp:12: error: previous declaration as
boost::function0<void,
std::allocatorboost::function_base > test'g++-3.4 (GCC) 3.4.4 20050314 (prerelease) (Debian 3.4.3-12)
mhpf. irgendwas muss an meiner boost/g++ installation kaputt sein.
-
so. ich hab dann mal apt-get remove g++ libboost und apt-get install g++ libboost gemacht.
jetzt lässt es sich einwandfrei kompilieren (und es läuft auch) es kommt aber ein warning:/usr/bin/ld: warning: libstdc++.so.5, needed by /usr/lib/gcc/i486-linux/3.4.4/../../../../lib/libboost_thread.so, may conflict with libstdc++.so.6
ich hab außerdem grad festgestellt das ich sowohl g++-3.4 als auch g++-3.3 drauf hab. kann es sein das der 3.4er ausversehen sachen vom 3.3er benutzt?!