2013-05-01 4 views
8

Ich bin neu bei Boost.Threads und versuche zu verstehen, wie Funktionsargumente an die boost::thread_groups::create_thread()-Funktion übergeben werden. Nach dem Lesen einiger Tutorials und der Boost-Dokumentationen verstehe ich, dass es möglich ist, die Argumente einfach an diese Funktion zu übergeben, aber ich kann diese Methode nicht zum Laufen bringen. Die andere Methode, über die ich lese, ist die Verwendung von Funktoren, um die Parameter an meine Funktion zu binden, aber das würde Kopien der Argumente erzeugen, und ich verlange streng, dass konstante Referenzen übergeben werden, da die Argumente große Matrizen sind (dies habe ich vor.) tun Sie mit boost::cref(Matrix) einmal bekomme ich dieses einfache Beispiel zu arbeiten).So übergeben Sie Funktionsparameter an boost :: thread_groups :: create_thread()

Nun lassen Sie uns auf den Code runter:

mt.cc: In function âvoid thr_main()â: 
mt.cc:46: error: no matching function for call to âboost::thread_group::create_thread(void (*)(float, float), float&, float&)â 
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: In member function âvoid boost::detail::thread_data<F>::run() [with F = void (*)(float, float)]â: 
mt.cc:55: instantiated from here 
/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: error: too few arguments to function 

Was ich tue, falsch:

void printPower(float b, float e) 
{ 
    cout<<b<<"\t"<<e<<"\t"<<pow(b,e)<<endl; 
    boost::this_thread::yield(); 
    return; 
} 

void thr_main() 
{ 
    boost::progress_timer timer; 
    boost::thread_group threads; 
    for (float e=0.; e<20.; e++) 
    { 
     float b=2.; 
     threads.create_thread(&printPower,b,e); 
    } 
    threads.join_all(); 
    cout << "Threads Done" << endl; 
} 

Dies ist nicht mit dem folgenden Fehler nicht kompilieren?

Antwort

15

Sie können keine Argumente an boost::thread_group::create_thread() Funktion übergeben, da es nur ein Argument erhält.

threads.create_thread(boost::bind(printPower, boost::cref(b), boost::cref(e))); 
#           ^to avoid copying, as you wanted 

Oder, wenn Sie boost::bind nicht verwenden möchten, können Sie boost::thread_group::add_thread() wie diese verwenden könnte: Sie könnten boost::bind verwenden

threads.add_thread(new boost::thread(printPower, b, e)); 
+0

Dieser Ansatz ist für mein Problem geeignet, da ich keine Kopien der Argumente machen leisten kann. Es wird jedoch der folgende Fehler ausgegeben: '/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: In Member-Funktion? Leere boost :: detail :: thread_data :: run() [mit F = void (*) (float, float)] â: mt.cc:55: von hier aus instanziiert /usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: Fehler: zu wenig Argumente zu Funktion " – Mindstorm

+0

@Mindstorm, hmm ... Code mit' add_thread' funktioniert für mich (Boost v1.53). – soon

+0

@Mindstorm, über das Kopieren vermeiden: verwenden Sie einfach 'boost :: cref' wie Sie bereits sagten. Ich habe die Antwort aktualisiert. – soon

5

Für mehr Flexibilität können Sie:

- Lambda-Funktionen (C++ 11): What is a lambda expression in C++11?

threads.create_thread([&b,&e]{printPower(b,e);}); 

-Functors, die die Argumente als Const-Referenzen speichern.

struct PPFunc { 
    PPFunc(const float& b, const float& e) : mB(b), mE(e) {} 
    void operator()() { printPower(mB,mE); } 
    const float& mB; 
    const float& mE; 
}; 

-std :: bind (C++ 11) oder boost :: bind

+0

Danke Peter! Diese Methoden funktionieren auch gut. – Mindstorm