【发布时间】:2011-12-19 00:28:42
【问题描述】:
我有一个项目,我们希望提供使用线程来加速一切。 我们希望能够在单独的线程中调用这个函数:
Request& Filter::processRequest(Request& req)
因此我将函数打包在 lambda 表达式中以访问返回值。
我现在收到以下运行时错误:
glibc detected ... double free or corruption (!prev): ...
当我取消注释将线程添加到组的行时,一切正常。
boost::thread_group thread;
for (std::set<boost::shared_ptr<Filter> >::iterator i = sources_.begin();
i != sources_.end(); ++i) {
Request ret
thread.add_thread(new boost::thread(boost::lambda::var(ret) =
(*i)->processRequest(req)));
req+=ret;
...
}
thread.join_all();
此运行时错误的原因可能是什么。或者有没有另一种方法可以把这个函数放在单独的线程中?
【问题讨论】:
-
您希望
boost::lambda::var(ret) = (*i)->processRequest(req)做什么?您在添加 N 个线程的循环中......那么 N 个稳定的“ret”位置在哪里通过引用存储结果? -
我在上面的代码中添加了我想要对 ret 执行的操作。我想把它加到req中。我认为每个线程都放了一份 ret 副本,还是这个假设有误?
-
我不是真正的
boost::lambda用户,我只是对boost::thread做了一点修改,所以我实际上对你的方法了解不多(尽管它让我觉得“不可以工作的方式”)。如果你启动一个异步任务,你不能在没有某种保证它已经完成计算的情况下使用它的结果。并且文档建议boost::lambda::var通过引用获取一个参数(如果它“复制”它,调用者将如何连接到副本?)......所以你真的只有一个Request ret;每次迭代都是“活的”循环。 -
我担心我必须重新设计我的程序以使函数无效。谢谢回复。我希望可能有一些其他的建议,否则我会关闭这个问题。
标签: c++ boost-thread