C++ Boost::函数绑定的成员函数变得无效
我有一个简单的线程池实现,使用C++ Boost::函数绑定的成员函数变得无效,c++,boost-thread,boost-bind,boost-function,C++,Boost Thread,Boost Bind,Boost Function,我有一个简单的线程池实现,使用boost::function和boost::bind将成员函数签名减少到void func(void)。然后使用一个由boost::function和int对组成的队列,弹出队列的顶部,并执行该函数(所有函数都包装在互斥块中) 你瞧,经过几次迭代后,断言跳闸,这表明我的boost::function不可调用 我首先想到的可能是函数数据(来自Foo类)在调用函数之前就已经被销毁了,但是据我所知,boost::function创建了一个数据副本以形成闭包。不幸的是,我
boost::function
和boost::bind
将成员函数签名减少到void func(void)
。然后使用一个由boost::function
和int
对组成的队列,弹出队列的顶部,并执行该函数(所有函数都包装在互斥块中)
你瞧,经过几次迭代后,断言跳闸,这表明我的
boost::function
不可调用
我首先想到的可能是函数数据(来自Foo
类)在调用函数之前就已经被销毁了,但是据我所知,boost::function
创建了一个数据副本以形成闭包。不幸的是,我不知道是什么原因导致boost::function
s无效,无法进一步解决这个问题。我是否错误地绑定了成员函数,或者问题是否介于这和尝试调用它之间
编辑:我应该提到:
Foo
是在堆上分配的,并且在线程加入之前不会delete
d。std::queue不是线程安全的。当你说你正在使用互斥来从队列中弹出时,我知道你也在做同样的事情来推队列
此外,你还需要照顾Foo的一生。考虑将SypDypTR传递给异步函数。(从_this()而不是此共享_)
注意:您可以使用boost::asio来实现任务调度。
这里有一篇关于这方面的很好的文章
std::queue不是线程安全的。当你说你正在使用互斥来从队列中弹出时,我知道你也在做同样的事情来推队列 此外,你还需要照顾Foo的一生。考虑将SypDypTR传递给异步函数。(从_this()而不是此共享_) 注意:您可以使用boost::asio来实现任务调度。 这里有一篇关于这方面的很好的文章
boost::function
将创建您传递给它的指针的副本,即它保留一个具有相同地址的指针。它没有*的副本,此
boost::function
将创建您传递给它的此
指针的副本,即它保留一个具有相同地址的指针。它没有*this
的副本。事实上,每次在互斥体中访问队列时,我都在包装它。Foo是在堆上分配的,在线程连接之前不会调用析构函数。另外,我做这篇文章是为了尝试和理解如何使用boost::function和boost::bind,但我肯定会研究boost::asio,谢谢!事实上,每次在互斥对象中访问队列时,我都会进行包装。Foo是在堆上分配的,在线程连接之前不会调用析构函数。另外,我做这篇文章是为了尝试和理解如何使用boost::function和boost::bind,但我肯定会研究boost::asio,谢谢!
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;
...