を使用した単純なスレッド プールの実装がboost::function
ありboost::bind
、メンバー関数のシグネチャを に減らしますvoid func(void)
。次に、boost::function
とint
のペアのキューを使用し、キューの先頭をポップして、関数を実行します (すべてミューテックス ブロックにラップされています)。
threadPool->addJob(boost::bind(&Foo::bar, this, arg1, arg2));
...
typedef boost::function<void(void)> func;
std::queue<std::pair<func, int> > funcQ;
void ThreadPool::addJob(func f){
funcQ.push(std::make_pair(f, j));
}
if (!funcQ.empty()){
func localFunc = (funcQ.front()).first;
...
funcQ.pop();
...
localFunc();
}
ただし、数回繰り返した後、()
関数で演算子を呼び出したときにセグメンテーション違反が発生していたので、関数が呼び出し可能であることを確認するために assert ステートメントを入れました。
...
assert(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...
見よ、数回の反復の後、アサートトリップが発生し、 myboost::function
が呼び出し可能でなかったことを示しています。
Foo
おそらく、関数が呼び出される前に(クラスからの)関数データが破棄されたのではないかと最初に考えましたが、私が理解しているようboost::function
に、データのコピーを作成してとにかくクロージャを形成します。boost::function
残念ながら、問題をさらに進めるために s が無効になる原因について十分に知りません。メンバー関数を正しくバインドしていませんか、それとも問題はそことそれを呼び出そうとする間のどこかにありますか?
編集:言及する必要がありました:Foo
はヒープに割り当てられdelete
、スレッドが結合されるまで実行されません。