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

C クラスのメンバー関数のスレッドを正しく作成するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-22 04:48:09
オリジナル
845 人が閲覧しました

How to Correctly Create Threads for C   Class Member Functions?

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート