我的应用程序有一个类似于以下代码的部分
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为空,并且在堆上创建向量时它会起作用。我期待上面的代码能够工作,因为即使在堆栈上创建了向量,向量仍然在范围内。
答案 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将参数传递给线程函数。