提升线程 - 通过引用传递参数

时间:2013-06-20 16:59:10

标签: c++ boost boost-thread boost-bind

我的应用程序有一个类似于以下代码的部分

void SomeClass::OtherMethod(std::vector<std::string>& g)
{
  g.pushback("Something");
}

void SomeClass::SomeMethod()
{
  std::vector<std::string> v;
  boost::thread t(boost::bind(&SomeClass::OtherMethod,this,v)
  t.join();
  std::cout << v[0]; //Why is this empty when the vector created on stack
}

我想知道为什么在堆栈上创建向量时向量v为空,并且在堆上创建向量时它会起作用。我期待上面的代码能够工作,因为即使在堆栈上创建了向量,向量仍然在范围内。

2 个答案:

答案 0 :(得分:10)

Bind复制其参数。使用boost::ref

boost::thread t(boost::bind(&SomeClass::OtherMethod,this, boost::ref(v))

答案 1 :(得分:0)

默认情况下,线程按值接受参数,即使函数本身需要引用。使用boost :: ref()强制通过引用传递参数。

  

()默认情况下,参数被复制到内部存储中,其中   它们可以被新创建的执行线程访问,即使是   函数中的相应参数需要引用。

一个。 Williams,“Concurrency in Action”,2.2将参数传递给线程函数。