2013-05-01 9 views
8

私はに新規であり、を受け取り、boost::thread_groups::create_thread()関数に関数の引数を渡す方法を理解しようとしています。いくつかのチュートリアルと拡張ドキュメントを読んだ後、この関数に引数を渡すことは可能だが、このメソッドを動作させることはできないことを理解しています。boost :: thread_groups :: create_thread()に関数のパラメータを渡す方法

私が読んだもう1つの方法は、ファンクタを使用して関数にパラメータをバインドすることですが、引数のコピーを作成することになります。引数が大きな行列になるのでconst参照を渡す必要がありますこの簡単な例がうまくいけば、boost::cref(Matrix)を使ってください)。

それでは、コードに降りてみましょう:

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

これは、次のエラーでコンパイルできません:

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 

を私が間違っているのか?

答えて

15

boost::thread_group::create_thread()関数に引数を渡すことはできません。これは引数が1つしかないためです。あなたはboost::bindを使用することができます。

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

それとも、あなたはこのようなboost::thread_group::add_thread()を使用することができ、boost::bindを使用しない場合:

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

後者のアプローチは私の問題に適しています。しかし、次のエラーがスローされます: '/usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:メンバー関数内でboost :: detail :: thread_data :: run()[F =空白(*)(float、float)]â: mt.cc:55:ここからインスタンス化 /usr/local/boost_1_44_0/include/boost/thread/detail/thread.hpp:61:エラー:引数が少なすぎる関数 ' – Mindstorm

+0

@Mindstorm、hmm ...' add_thread'のコードは私のために働きます(boost v1.53)。 – soon

+0

@Mindstormについては、コピーを避けてください。既に述べたように 'boost :: cref'を使用してください。私は答えを更新しました。 – soon

5

あなたが使用することができ、より柔軟性を高めるために:

- ラムダ関数(C++ 11):What is a lambda expression in C++11?

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

- 引数を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 ::バインド(C++ 11)または後押し::バインド

+0

Thanks Peter!これらのメソッドも正常に動作します。 – Mindstorm

関連する問題