5

クラスで c++11 スレッド ライブラリを使用していますが、正常に動作します。
このコードの説明が必要なだけなので、正しく理解できます。

私のクラス.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 番目のパラメーターは、スレッドが親プロセスを認識しているクラス自体ですか?

これについての説明が見つかりませんでした。コードのみと私はそれを理解したいと思います。ありがとう!

4

2 に答える 2

3

&foo::workworkは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 に答える