ホームページ >バックエンド開発 >C++ >pthreads で C クラスのメンバー関数を使用するにはどうすればよいですか?

pthreads で C クラスのメンバー関数を使用するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-23 04:29:20375ブラウズ

How Can I Use C   Class Member Functions in pthreads?

クラス メンバー関数のスレッドへの組み込み

C では、クラス メンバー関数は本質的に「this」と呼ばれる隠しパラメーターを運びます。標準ライブラリの pthread_create() 関数はそのようなパラメーターのない関数ポインターを想定しているため、メンバー関数を使用してスレッドを作成しようとする場合、これにより問題が発生します。

コンパイル エラー: 関数ポインターを変換できません

最初のコード スニペットが示すように、クラス メンバー関数を pthread_create() に渡そうとすると、直接コンパイル エラー:

pthread_create(&t1, NULL, &c[0].print, NULL);

コンパイラは、メンバー関数ポインター (void* (tree_item::*)(void*)) を期待される関数ポインター型 (void* (*)( void*)).

解決策: 静的クラス メソッドまたは独立関数

この問題を回避するには、2 つの実行可能なアプローチがあります。

  1. 静的クラス メソッド:
    静的クラスを定義する必要なオブジェクトをカプセル化するメソッド (「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();
        }
    };
  2. 独立関数:
    クラス メンバー関数のラッパーとして機能する別の関数を作成し、「this」を明示的に渡します。 「ポインタとして」引数:

    void hello_wrapper(void *context)
    {
        C *object = (C *)context;
        object->print();
    }

静的クラス メソッドまたはラッパー関数を使用したスレッドの作成

これらのアプローチのいずれかで、pthread_create( ) 必要なクラス メンバー関数を実行するスレッドを作成します:

C c;
pthread_create(&amp;t, NULL, &amp;C::hello_helper, &amp;c);  // Static Class Method

pthread_create(&amp;t, NULL, &amp;hello_wrapper, &amp;c);  // Wrapper Function

以上がpthreads で C クラスのメンバー関数を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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