【发布时间】:2013-07-13 07:21:33
【问题描述】:
我有一个简单的线程池实现,使用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(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...
你瞧,在几次迭代之后,断言触发,表明我的 boost::function 不可调用。
我首先认为函数数据(来自Foo 类)可能在调用函数之前已被销毁,但据我了解,boost::function 无论如何都会创建数据的副本以形成闭包。不幸的是,我对导致boost::functions 无效的原因知之甚少,无法进一步解决该问题。我是否错误地绑定了成员函数,或者问题是否存在于其中并试图调用它?
编辑:我应该提到:Foo 分配在堆上,在线程加入之前不是deleted。
【问题讨论】:
-
boost::function将创建您传递给它的this指针的副本,即它保留具有相同地址的指针。它不拥有*this的副本。
标签: c++ boost-thread boost-bind boost-function