Boost::函数绑定的成员函数无效
Boost::function bound member function becomes invalid
我有一个简单的线程池实现,使用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();
}
然而,经过几次迭代后,当我调用函数上的()
运算符时,这导致了segfault,所以我抛出了一个assert语句来确保函数是可调用的:
...
assert(funcQ.front().first);
func localFunc = (funcQ.front()).first;
...
瞧,在几次迭代之后,assert跳闸,表明我的boost::function
不可调用。
我最初认为函数数据(来自Foo
类)可能在调用函数之前就已经被破坏了,但据我所知,boost::function
无论如何都会创建数据的副本来形成闭包。不幸的是,我对boost::function
无效的原因了解不够,无法进一步解决这个问题。我是否错误地绑定了成员函数,或者问题是否介于两者之间并试图调用它?
编辑:我应该提到:Foo
是在堆上分配的,在线程连接之前不是delete
d。
std::队列不是线程安全的。当您说您正在使用互斥从队列中弹出时,我理解您将对队列中的推送执行同样的操作。
此外,你需要照顾福的一生。考虑将shared_ptr传递给异步函数。(shared_from_this()而非此)
注意:您可以使用boost::asio来实现任务调度。这是一篇很好的文章http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- C++无效的函数类型转换
- C++无效使用非静态成员函数?
- 模板和无效函数调用C++
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 无效打印(矢量<string>)函数未打印
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- C26486 - 不向函数传递可能无效的指针?
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- 调用boost v1.58中的函数时出现模板名称使用无效错误
- 使用 vector.sort() 的非静态成员函数无效使用
- 将数组传递给构造函数无效
- 使用auto参数munmap_chunk()返回auto的函数:无效指针
- Boost::函数绑定的成员函数无效
- 为什么在模板类中声明函数无效?
- 使用非英语文件名调用avio_open函数无效
- Android NDK线程使用非静态成员函数无效