問題:
次の場合、クラス メンバー関数のスレッドを作成するにはどうすればよいですか?関数はクラス インスタンスのベクトルから呼び出されますか?
例コードとエラー:
次のコードを考えてみましょう:
class c { void *print(void *) { std::cout << "Hello"; } }; std::vector<c> classes; pthread_t t1; classes.push_back(c()); classes.push_back(c()); // Attempt to create a thread for c.print() pthread_create(&t1, NULL, &c[0].print, NULL); // Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
説明:
C クラスのメンバー関数が内部的に渡される暗黙的な this パラメータ。ただし、 pthread_create() はこの隠しパラメーターを処理しないため、メンバー関数を関数ポインターにキャストするときに型の不一致が発生します。
解決策:
2 つの方法があります。この問題について:
このメソッドはインスタンスではなくクラス自体に関連付けられているため、 this パラメーターがありません。以下のように:
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
このメソッドは、クラス定義の外側の関数を使用します。クラスとそのメンバーは次のようになります:
// Outside the class void c_print_wrapper(c *c_instance) { c_instance->print(); } ... c c1, c2; pthread_t t1; classes.push_back(c1); classes.push_back(c2); // Create the thread for c.print() using wrapper function pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
以上がベクターから呼び出される C クラスのメンバー関数のスレッドを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。