5

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

我的课.h

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

类.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::部分的情况下调用它。第二个参数是线程知道父进程的类本身?

我找不到对此的解释。只有代码,我想理解它。谢谢!

4

2 回答 2

3

&foo::work是必需的,因为work它是属于 class 的成员函数foo。一个(非静态)成员函数只有在它所属的对象也是已知的情况下才能被访问。

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

于 2013-09-03T12:59:02.660 回答
2

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

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

于 2013-09-03T12:58:55.217 回答