【问题标题】:Boost threads - passing parameters by referenceBoost 线程 - 通过引用传递参数
【发布时间】:2013-06-17 15:44:59
【问题描述】:

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

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 在堆栈上创建时为空,而在堆上创建时它可以工作。我期待上面的代码能够工作,因为即使在堆栈上创建向量,它仍然在范围内。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。但是我还是不明白。如果 bind 复制它的参数,那会有什么不同。对不起,我在这里很困惑
    • @MistyD 现在它复制了一个reference_wrapper,它通过引用获取其参数(即您的向量)并提供隐式T&amp; 类型转换运算符。
    • 我知道boost::ref 可以解决问题。我只是好奇为什么没有它就行不通。您说不使用 boost::ref 它将制作副本。我只是好奇这样一个事实,即使它制作了副本,为什么它不起作用?
    • @MistyD 因为OtherMethod 通过引用获取原始向量的副本 并对其进行更改。原始向量保持不变。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2020-11-02
      • 1970-01-01
      • 2011-08-21
      • 2020-05-03
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多