ホームページ >バックエンド開発 >C++ >スレッドから C クラスのメンバー関数を安全に呼び出すにはどうすればよいですか?

スレッドから C クラスのメンバー関数を安全に呼び出すにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-26 16:38:09134ブラウズ

How Can I Safely Call C   Class Member Functions from Threads?

スレッド内のクラス メンバー関数の安全な呼び出し

マルチスレッドの領域では、スレッドの実行内でクラスのメンバー関数を呼び出す必要があることがよくあります。ただし、このタスクでは、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" パラメータを持つメンバー関数へのポインタです。

解決策: 静的クラス メソッドまたは関数を使用するPointer

このハードルを克服するには、次の 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);

Function Pointer

もう 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。