我有一个项目,我们想要提供使用线程加速一切。 我们希望能够在各个线程中调用此函数:
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();
此运行时错误的原因可能是什么。或者是否有另一种方法将此功能放在单独的线程中?
答案 0 :(得分:1)
如果这种技术完全可行,则需要多个可以稳定引用的ret值(每个执行线程一个)。而且你必须等到你的线程加入完成后才使用这些值。
您可以尝试的一个简单修改就是在vector<Request> retValues
的循环之外创建一个向量...然后在每次add_thread
时向向量添加一个元素并传递一个引用那个元素。然后,如果你等到联接后使用这些值,也许它会起作用吗?
boost::thread_group thread;
vector<Request> retValues;
for (std::set<boost::shared_ptr<Filter> >::iterator i = sources_.begin();
i != sources_.end(); ++i) {
retValues.push_back(0);
thread.add_thread(new boost::thread(
boost::lambda::var(retValues.back()) =
(*i)->processRequest(req)));
...
}
thread.join_all();
// retValues safe to use here...
(注意:使用boost::lambda
可能不是必需的;您可以使用boost :: bind连接到存储结果的worker类:
Getting return value from a boost::threaded member function?
...但实际上,无论你需要为每个线程存储一个单独的变量来存储结果......它的生命周期足够长,以便线程能够写入它。)