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

ベクターから呼び出される C クラスのメンバー関数のスレッドを作成するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-25 19:53:12846ブラウズ

How to Create Threads for C   Class Member Functions Invoked from a Vector?

クラス メンバー関数のスレッドの作成

問題:

次の場合、クラス メンバー関数のスレッドを作成するにはどうすればよいですか?関数はクラス インスタンスのベクトルから呼び出されますか?

例コードとエラー:

次のコードを考えてみましょう:

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 つの方法があります。この問題について:

  1. 静的クラスを使用するmethod:

このメソッドはインスタンスではなくクラス自体に関連付けられているため、 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);
  1. 単純な通常の関数を使用します:

このメソッドは、クラス定義の外側の関数を使用します。クラスとそのメンバーは次のようになります:

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

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