【问题标题】:Boost::function bound member function becomes invalidBoost::function 绑定的成员函数失效
【发布时间】: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


【解决方案1】:

std::queue 不是线程安全的。当你说你正在使用互斥锁从队列中弹出时,我知道你会在队列中做同样的事情。

此外,您需要注意 Foo 的生命周期。考虑将 shared_ptr 传递给异步函数。 (shared_from_this() 而不是这个)

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

【讨论】:

  • 每次在互斥体中访问队列时,我确实在包装。 Foo 在堆上分配,并且在线程加入之前不会调用析构函数。另外,我这样做是为了尝试了解如何使用 boost::function 和 boost::bind,但我一定会研究 boost::asio,谢谢!
猜你喜欢
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多