生成线程时boost :: thread运行时错误

时间:2011-10-31 19:44:12

标签: c++ boost-thread

我有一个项目,我们想要提供使用线程加速一切。 我们希望能够在各个线程中调用此函数:

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();

此运行时错误的原因可能是什么。或者是否有另一种方法将此功能放在单独的线程中?

1 个答案:

答案 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?

...但实际上,无论你需要为每个线程存储一个单独的变量来存储结果......它的生命周期足够长,以便线程能够写入它。)