【问题标题】:Why are member functions passed differently than local functions to a std::thread?为什么成员函数与局部函数不同地传递给 std::thread?
【发布时间】:2021-05-30 16:20:38
【问题描述】:

我试图了解std::thread 是如何使用的。

标题如下:

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
  • 如何识别f 是通用引用还是右值?根据我在网上找到的:

“如果推导 T 并且变量/参数类型是不合格的 T&& ,那么只有它是通用引用。”

unqualified T&amp;&amp; 指的是什么? autotemplate?

  • 如果我有一个函数foo,我可以像std::thread(foo) 一样调用它。这是否意味着 foo 被用作左值引用,因为它不符合右值引用的条件?

  • 为什么传递函数的方式与成员函数不同?如果 foo 是课程的一部分,您将无法像 std::thread(obj.foo) 那样使用它 - 而是 std::thread(&amp;Class::foo, &amp;obj) 有效。其背后的逻辑推理是什么?

  • 如何将局部变量/向量传递给线程?我尝试了以下方法,但在函数本身中,即使vector.size() 确实输出正确,我也无法访问任何矢量元素。

void Class::foo(vector<int>v)
{
   std::cout<<v[0]; // prints nothing
}

int main(void)
{
    std::vector<int>v = {12,3};

    Class obj;

    std::thread t1(&Class::foo, &obj, v);

    t1.join();

}

【问题讨论】:

  • 您需要展示整个程序。如果它太大,请制作一个较小的版本以显示。如果我不得不打赌,你正在退出你的函数并破坏你的局部变量,然后在你的线程中使用他们死去的僵尸尸体。不要那样做。
  • 另外,成员函数指针也不同,因为它们总是两个指针。一个指向函数的指针和一个指向用来调用该函数的对象的指针。

标签: c++ multithreading stl stdthread


【解决方案1】:

不合格的T&amp;&amp;指的是什么?

指函数模板的函数参数。 fargs... 是参数。它们满足了所描述的转发引用的要求(只要模板类型参数没有显式传递,这种情况下就不会从函数参数中推断出类型)。

为什么传递函数的方式与成员函数不同?

因为非静态成员函数有一个隐式实例参数,并且因为它们不会隐式衰减为指向成员函数的指针。

如何将局部变量/向量传递给线程?

取决于上下文。复制通常是最简单的。

【讨论】:

  • 1) 没有显式参数传递的示例包括autotemplate,因为类型是在运行时推导出来的? 2)隐式实例是指this指针? 3) 你看到我的代码有什么问题吗?
  • @Jazzy 1) 适用于函数模板。 auto&amp;&amp; 可以用作函数模板的参数,在这种情况下它是转发引用 2) 是。 3) 号码godbolt.org/z/6Pea47
  • 公平。我使用unsigned 类型(我的错)并意识到您必须在流中指定(unsigned)。理解了额外的this 指针,但是为什么成员函数的“地址”(?)作为第一个参数传递,第二个是对象的引用?仍然不清楚成员函数的传递方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2020-12-09
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2019-09-27
相关资源
最近更新 更多