gpt4 book ai didi

c++ - Boost::function 绑定(bind)成员函数失效

转载 作者:太空宇宙 更新时间:2023-11-04 11:52:15 25 4
gpt4 key购买 nike

我有一个简单的线程池实现,使用 boost::functionboost::bind 将成员函数签名减少为 void func(void) 。然后使用 boost::functionint 对的队列,弹出队列的顶部,并执行函数(全部包装在互斥 block 中)。

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 无效的原因知之甚少,无法进一步解决该问题。我是否错误地绑定(bind)了成员函数,或者问题是否出在尝试调用它之间的某处?

编辑:我应该提到:Foo 分配在堆上,并且在线程加入之前不会deleted。

最佳答案

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/

关于c++ - Boost::function 绑定(bind)成员函数失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17654056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com