我有一个使用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::function
无效的原因,无法继续解决问题。我是否错误地绑定了成员函数,或者问题是介于两者之间还是试图调用它?
编辑:我应该提到:Foo
在堆上分配,并且在加入线程之前不是delete
d。
答案 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/