使用带有参数的类成员函数调用std :: thread构造函数

时间:2014-07-20 08:02:09

标签: c++ multithreading c++11

我知道存在this个问题和this问题。 我已经通过了他们两个并且没有能够解决我的问题。我能够为带有零参数的类成员函数运行示例,但是如果成员函数有参数,则无法推断线程的构造函数是什么样的。

我有一个A类.A有一个成员函数f,它带有2个参数p1和p2。 我已经实例化了A类的对象a。我想在一个线程中调用函数f。

来自cppreference.com

template< class Function, class... Args > 
explicit thread( Function&& f, Args&&... args );

是我必须编写构造函数的方法。

我无法破译上述定义。如何调用定义为

的a.f(p1,p2)

void A::f(int p1, int p2)

在一个帖子中?

1 个答案:

答案 0 :(得分:7)

只需传递参数:

std::thread t(&A::f, &bar, p1, p2);
t.join();

注意:请注意,我们正在传递bar对象的地址,否则线程构造函数会复制您的对象。通过这样做,你必须保证你的对象比你的线程更长。请注意,其他参数也是如此。如果是参数,您只需使用std::ref

一般情况下,正如我在其他帖子中所提到的,std::thread构造函数是根据INVOKE定义(§20.8.2.1)定义的:

  

按如下方式定义INVOKE(f,t1,t2,...,tN):

     
      
  • (t1。* f)(t2,...,tN)当f是指向类T的成员函数的指针时,t1是类型为T的对象或对象的引用   输入T或对从T派生的类型的对象的引用;
  •   
  • ((* t1)。* f)(t2,...,tN)当f是指向类T的成员函数的指针时,t1不是前面描述的类型之一   项;
  •   
  • t1。* f当N == 1且f是指向类T的成员数据的指针时,t 1是类型为T或者对象的对象   引用类型为T的对象或引用对象的对象   类型派生自T;
  •   
  • (* t1)。* f当N == 1且f是指向T类成员数据的指针时,t 1不是前一项中描述的类型之一;
  •   
  • f(t1,t2,...,tN)在所有其他情况下。
  •