类中的C ++ 11线程

时间:2013-09-03 12:53:58

标签: c++ multithreading c++11 member-function-pointers

我正在使用带有类的c ++ 11线程库,它工作正常 我只需要对此代码进行解释,以便我理解正确。

我的class.h

class foo {
  private:
    std::thread t1;
    void worker();
  public:
    void work();
};

class.cpp

#include "class.h"

void foo::worker() {
  std::cout << "worker..." << std::endl;
}

void foo::work() {
  t1 = std::thread(&foo::worker, this);
  t1.join();
}

现在是main.cpp

#include "class.h"

int main(int argc, char **argv) {
  foo bar;
  bar.work();
}

我真正理解的是调用线程的类函数 我使用std::thread(&foo::work, this)并解释此调用如下: 第一个参数是指向函数的指针,但我不知道为什么我不能只调用它 没有&foo::部分。 第二个参数是线程知道父进程的类本身吗?

我找不到这方面的解释。只有代码,我想了解它。 谢谢!

2 个答案:

答案 0 :(得分:3)

&foo::work是必需的,因为work是属于类foo的成员函数。只有在知道它所属的对象时才能访问(非静态)成员函数。

this参数是指向应该调用该方法的对象的指针。

答案 1 :(得分:2)

地址位只是表达成员函数地址的语法。我相信这也可以表示为this->worker。我不知道为什么worker本身是不允许的---它似乎是明确的,但那是C ++。

您必须传递成员函数指针和this,以便线程可以在正确的对象上调用成员函数。在内部,线程包含一个成员函数指针,比如pmf(指向foo::worker)和对象指针,比如说po(指向传递的this)。它需要能够调用(po->*pmf)(),这会导致在正确的对象上调用worker