2011-02-02 3 views
2

だから私は別の新しいスレッド内の各ベクトル関数の実行をしたり、theradたびに作成しないように、そのより良いスレッドのベクトルを持っている場合boost.thread使用してどのように新しい個別のスレッドでベクトルから各関数を実行するにはどうすればよいですか?

typedef boost::function<void(DataType)> Function; 
typedef std::vector<Function>  FunctionSequence; 
typedef typename FunctionSequence::iterator FunctionIterator; 


DataType* dataElement; 
FunctionSequence funcs; 
    //... 
    for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it){ 
     DataType dataCopy; 
     dataCopy = *dataElement; 
     (*it)(dataCopy); 

のようなものがありますか?

+0

達成しようとしていることがわかりません。もう少し詳細を教えてもらえますか? DataTypeの同じインスタンスで各関数を実行しようとしていますか?その場合、関数はDataTypeの値を変更しますか?ありがとう – skimobear

答えて

4

何をやろうとしているのは、あなたがBoost ThreadsBoost Bindを使用したいと思う、各機能のための新しいスレッドを起動して、あなたのデータ型のオブジェクトのコピーを渡している場合:

#include <boost/function.hpp> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 

boost::thread_group tg; 

for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it) 
{ 
    tg.create_thread(boost::bind(*it, *dataElement)); 
} 

tg.join_all(); 

まず、起動するすべてのスレッドのコンテナとして機能するboost::thread_groupを作成します。次にcreate_threadは新しいスレッドを起動し、渡された関数を呼び出します。この場合、単純な関数以上の呼び出しが必要なので、boost::bindを使用してスレッドが実行できる関数void()を作成する必要があります。 boost::bindへの呼び出しは、最初に呼び出す関数を指定し、関数に渡すパラメータを指定します。それはすでに引数をコピーするので、別のコピーをあらかじめ作成する必要はありません。

すべてのスレッドを起動したら、tg.join_all()を呼び出して、すべてのスレッドが完了するまで待ってから続行します。 join_all()を呼び出すことは非常に重要であり、バックグラウンドでスレッドが不正を実行しないようにします。

明らかに、多くのスレッドを作成したくない関数を呼び出す場合は、未処理のスレッドの数を追跡し、既存のスレッドが終了すると新しいスレッドのみを作成する必要があります。これは、呼び出される関数内にいくつかの余分なブックを必要とします(そして、関数をラップすることを含むかもしれません)。あなたの場合はおそらく必要ないでしょう。

関連する問題