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 constructor UCIControll::UCIControll(Engine*)': ucicontroll.cpp:12: error: no matching function for call toboost::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 asboost::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?!


Anmelden zum Antworten