Boost ::函数绑定成员函数变为无效

时间:2013-07-15 12:16:45

标签: c++ boost-thread boost-bind boost-function

我有一个使用boost::functionboost::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(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...

瞧,经过几次迭代后,断言跳闸,表明我的boost::function无法调用。

我首先想到函数数据(来自Foo类)可能在调用函数之前被销毁了,但据我所知,boost::function创建了一个数据副本以形成无论如何关闭。不幸的是,我不了解导致boost::function无效的原因,无法继续解决问题。我是否错误地绑定了成员函数,或者问题是介于两者之间还是试图调用它?

编辑:我应该提到:Foo在堆上分配,并且在加入线程之前不是delete d。

1 个答案:

答案 0 :(得分:1)

std :: queue不是线程安全的。当你说你正在使用互斥锁从队列中弹出时,我知道你会为推进队列做同样的事情。

另外,你需要照顾Foo的一生。考虑将shared_ptr传递给异步函数。 (shared_from_this()而不是this)

注意:您可以使用boost :: asio来实现任务调度。 这是一篇非常好的文章 http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/