2013-05-01 15 views
8

Sono nuovo a Boost.Threads e sto cercando di capire come passare gli argomenti di funzione alla funzione boost::thread_groups::create_thread(). Dopo aver letto alcuni tutorial e la documentazione di potenziamento, capisco che è possibile passare semplicemente gli argomenti a questa funzione ma non riesco a far funzionare questo metodo.Come passare i parametri di funzione a boost :: thread_groups :: create_thread()

L'altro metodo che ho letto sta per usare funtori per associare i parametri per la mia funzione, ma che creerebbe le copie degli argomenti e ho rigorosamente richiede che i riferimenti const essere passati dal momento che gli argomenti saranno grandi matrici (questo ho intenzione di fare usando boost::cref(Matrix) una volta che ho questo semplice esempio di lavoro).

Ora, veniamo al codice:

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; 
} 

Questo non viene compilato con il seguente errore:

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 

Che cosa sto facendo di sbagliato?

risposta

15

Non è possibile passare argomenti alla funzione boost::thread_group::create_thread(), poiché ottiene un solo argomento. È possibile utilizzare boost::bind:

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

Oppure, se non si desidera utilizzare boost::bind, si potrebbe usare boost::thread_group::add_thread() come questo:

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

Quest'ultimo approccio è adatto per il mio problema dal momento che non posso permettermi di fare copie degli argomenti. Tuttavia, genera il seguente errore: '/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp: nella funzione membro âvoid boost :: detail :: thread_data :: run() [con F = void (*) (float, float)] â: mt.cc:55: istanziato da qui /usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61: errore: troppo pochi argomenti per function' – Mindstorm

+0

@Mindstorm, hmm ... Il codice con 'add_thread' funziona per me (boost v1.53). – soon

+0

@Mindstorm, su come evitare di copiare: usa 'boost :: cref' come hai già detto. Ho aggiornato la risposta. – soon

5

Per una maggiore flessibilità è possibile utilizzare:

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

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

-Funzionatori che memorizzano gli argomenti come riferimenti const.

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) o boost :: bind

+0

Grazie Peter! Anche questi metodi funzionano bene. – Mindstorm