マルチスレッドの領域では、スレッドの実行内でクラスのメンバー関数を呼び出す必要があることがよくあります。ただし、このタスクでは、C クラスのメンバー関数に隠された "this" パラメータが原因で問題が発生する可能性があります。
たとえば、次のことを考えてみましょう。
class C { void *print(void *) { cout << "Hello"; } };
次に、次のベクトルを作成しましょう。 C インスタンス:
vector<C> classes; pthread_t t1; classes.push_back(C()); classes.push_back(C());
c.print() を実行するスレッドを作成するには、直感的に次のようにします。 write:
pthread_create(&t1, NULL, &c[0].print, NULL);
ただし、これによりエラーが発生します:
cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’
この問題は、pthread_create() が特定の型の関数ポインターを予期しているのに対し、c[0] が原因で発生します。 .print は、非表示の "this" パラメータを持つメンバー関数へのポインタです。
このハードルを克服するには、次の 2 つのオプションがあります。
静的クラス メソッドには「this」パラメータがなく、パラメータなしで直接呼び出すことができます。クラスのインスタンス。 hello 関数の静的クラス メソッドを実装する方法は次のとおりです:
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } };
次に、静的クラス メソッドを使用してスレッドを作成できます:
pthread_create(&t, NULL, &C::hello, NULL);
もう 1 つのオプションは、メンバー関数をカプセル化し、「this」パラメーターを明示的に提供する関数ポインターを使用することです。この関数ポインタは、スレッドの作成に使用できます。
C c; pthread_create(&t, NULL, &C::hello_helper, &c);
ここで、hello_helper は次のように定義されています。
void *hello_helper(void *context) { return ((C *)context)->hello(); }
静的クラス メソッドまたは関数ポインタを使用すると、安全にスレッドを作成できます。 「this」パラメータの問題を回避して、スレッド内のクラスのメンバー関数を呼び出します。
以上がスレッドから C クラスのメンバー関数を安全に呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。