Boost::函数绑定的成员函数无效

Boost::function bound member function becomes invalid

本文关键字:函数 无效 成员 绑定 Boost      更新时间:2023-10-16

我有一个简单的线程池实现,使用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();
}

然而,经过几次迭代后,当我调用函数上的()运算符时,这导致了segfault,所以我抛出了一个assert语句来确保函数是可调用的:

...
assert(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...

瞧,在几次迭代之后,assert跳闸,表明我的boost::function不可调用。

我最初认为函数数据(来自Foo类)可能在调用函数之前就已经被破坏了,但据我所知,boost::function无论如何都会创建数据的副本来形成闭包。不幸的是,我对boost::function无效的原因了解不够,无法进一步解决这个问题。我是否错误地绑定了成员函数,或者问题是否介于两者之间并试图调用它?

编辑:我应该提到:Foo是在堆上分配的,在线程连接之前不是deleted。

std::队列不是线程安全的。当您说您正在使用互斥从队列中弹出时,我理解您将对队列中的推送执行同样的操作。

此外,你需要照顾福的一生。考虑将shared_ptr传递给异步函数。(shared_from_this()而非此)

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