【问题标题】:Return Double from Boost thread从 Boost 线程返回 Double
【发布时间】:2011-03-01 14:59:35
【问题描述】:

您好,我有一个 Boost 线程,它应该返回一个 double。函数如下所示:

void analyser::findup(const double startwl, const double max, double &myret){
  this->data.begin();
  for(int i = (int)data.size() ; i >= 0;i--){
    if(this->data[i].lambda > startwl){
      if(this->data[i].db >= (max-30)) {
        myret = this->data[i+1].lambda;
        std::cout <<"in thread " << myret << std::endl;
        return;
      }
    }
  }
}

这个函数被另一个函数调用:

void analyser::start_find_up(const double startwl, const double max){
  double tmp = -42.0;
  boost::thread up(&analyser::findup,*this, startwl,max,tmp);
  std::cout << "before join " << tmp << std::endl;
  up.join();
  std::cout << "after join " << tmp << std::endl;
}

无论如何,我已经尝试并在 Google 上搜索了几乎所有内容,但我无法让它返回值。

输出现在看起来像这样。

before join -42
in thread 843.487
after join -42

感谢您的帮助。

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    tmp 在线程加入后未获得预期值,因为创建 boost::thread 对象会将所有参数复制到线程存储 (see documentation)。

    您必须用boost::ref 封装tmp,这具有提供“可复制构造的引用”的效果(很抱歉,如果术语不充分,但就是这样)

    double tmp = -42.0;
    boost::thread up(&analyser::findup,*this, startwl,max, boost::ref(tmp));
    

    更多关于Thread Management documentation

    【讨论】:

    • 需要特别注意的是参数是复制的。查看文档中的constructor notes
    • 我已经批准了您的待定编辑,因此我无法对问题进行自己的编辑。您能否再修改一次问题,使标签为 boostc++?当前的标签是没有意义的。
    • 感谢这实际上是我的“第一次”发帖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2012-02-27
    相关资源
    最近更新 更多