boost线程没有填充引用传递的本地对象

时间:2016-05-08 21:24:00

标签: c++ boost boost-thread

我的代码设置如下:

class Foo
{
  void doWork(std::vector<int>& to_fill)
  {
    //do some of the filling in another thread
    boost::thread thread(&Foo::workToDoInThread, this, to_fill);

    //do some filling in the main calling thread
    std::vector<int> new_to_fill;
    new_to_fill.push_back(0);     //other, similar operations

    //in case the other thread is still working, wait for it to finish
    thread.join();

    //combine the two vectors:
    to_fill.insert(to_fill.end(), new_to_fill.begin(), new_to_fill.end();

  }

  void workToDoInThread(std::vector<int>& to_fill)
  {
    to_fill.push_back(1);     //other, similar operations
  }
}

这里的问题是to_fill向量是空的,如果在调用join()后立即检查它。所以基本上我放松了由另一个线程填充的所有值。但如果我这样做:

class Foo
{
  std::vector<int> temp_to_fill;

  void doWork(std::vector<int>& to_fill)
  {
    //do some of the filling in another thread
    boost::thread thread(&Foo::workToDoInThread, this);

    //do some filling in the main calling thread
    std::vector<int> new_to_fill;
    new_to_fill.push_back(0);     //other, similar operations

    //in case the other thread is still working, wait for it to finish
    thread.join();

    //combine the two vectors:
    to_fill.insert(to_fill.end(), new_to_fill.begin(), new_to_fill.end();
    to_fill.insert(to_fill.end(), temp_to_fill.begin(), temp_to_fill.end();

    //clear the temp vector for the next call
    temp_to_fill.clear();

  }

  void workToDoInThread()
  {
    temp_to_fill.push_back(1);     //other, similar operations
  }
}

这似乎工作得很好。为什么呢?

1 个答案:

答案 0 :(得分:2)

线程参数确实是按值复制的。如果您确实需要通过引用传递参数,请使用boost::refstd::ref

boost::thread thread(&Foo::workToDoInThread, this, boost::ref(to_fill));

这将创建一个引用包装器,它仍然按值复制,但在内部跟踪实际引用。