クラス メンバー関数でのスレッドの作成
C クラスを使用する場合、共通の課題はメンバー関数でのスレッドの作成です。次のクラスについて考えてみましょう。
class c { // ... void *print(void *){ cout << "Hello"; } }
c オブジェクトのベクトルがあり、c.print() 関数でスレッドを作成したいとします。ただし、次のコードではエラーが発生します:
pthread_create(&t1, NULL, &c[0].print, NULL);
エラー メッセージは、関数ポインターが pthread_create() の 3 番目の引数に予期される型と一致しないことを示します。
解決策:
このエラーは、C クラスのメンバー関数に暗黙的に渡される非表示のこのパラメーターがあるために発生します。 pthread_create() は、c のどのインスタンスを this パラメータに使用するかを知りません。これを解決するには、静的クラス メソッド (this パラメーターを持たない) またはプレーン関数を使用してクラスをブートストラップする必要があります。
静的クラス メソッドのアプローチ:
class C { public: static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; // ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
このアプローチは、静的クラス メソッド hello_helper() を定義します。このメソッドには this パラメータがなく、呼び出しが hello() メンバーにラップされます。 function.
プレーン関数のアプローチ:
void hello(void *context) { C *c = (C *)context; c->hello(); } // ... C c; pthread_t t; pthread_create(&t, NULL, &hello, &c);
ここでは、void ポインタを受け取ってそれにキャストするプレーン関数 hello() を定義します。 cの例。次に、c インスタンスで hello() メンバー関数を呼び出します。
以上がC クラスのメンバー関数のスレッドを正しく作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。