1

を使用した単純なスレッド プールの実装がboost::functionありboost::bind、メンバー関数のシグネチャを に減らしますvoid func(void)。次に、boost::functionintのペアのキューを使用し、キューの先頭をポップして、関数を実行します (すべてミューテックス ブロックにラップされています)。

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、スレッドが結合されるまで実行されません。

4

1 に答える 1