クラス メンバー関数のスレッドへの組み込み
C では、クラス メンバー関数は本質的に「this」と呼ばれる隠しパラメーターを運びます。標準ライブラリの pthread_create() 関数はそのようなパラメーターのない関数ポインターを想定しているため、メンバー関数を使用してスレッドを作成しようとする場合、これにより問題が発生します。
コンパイル エラー: 関数ポインターを変換できません
最初のコード スニペットが示すように、クラス メンバー関数を pthread_create() に渡そうとすると、直接コンパイル エラー:
pthread_create(&t1, NULL, &c[0].print, NULL);
コンパイラは、メンバー関数ポインター (void* (tree_item::*)(void*)) を期待される関数ポインター型 (void* (*)( void*)).
解決策: 静的クラス メソッドまたは独立関数
この問題を回避するには、2 つの実行可能なアプローチがあります。
静的クラス メソッド:
静的クラスを定義する必要なオブジェクトをカプセル化するメソッド (「this」ポインタを受け入れません)機能:
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } };
独立関数:
クラス メンバー関数のラッパーとして機能する別の関数を作成し、「this」を明示的に渡します。 「ポインタとして」引数:
void hello_wrapper(void *context) { C *object = (C *)context; object->print(); }
静的クラス メソッドまたはラッパー関数を使用したスレッドの作成
これらのアプローチのいずれかで、pthread_create( ) 必要なクラス メンバー関数を実行するスレッドを作成します:
C c; pthread_create(&t, NULL, &C::hello_helper, &c); // Static Class Method pthread_create(&t, NULL, &hello_wrapper, &c); // Wrapper Function
以上がpthreads で C クラスのメンバー関数を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。