1. ホーム
  2. c++

[解決済み] クラスからのpthread関数

2023-03-16 01:42:19

質問

例えば、次のようなクラスがあるとします。

class c { 
    // ...
    void *print(void *){ cout << "Hello"; }
}

そして、ベクトルであるc

vector<c> classes; pthread_t t1;
classes.push_back(c());
classes.push_back(c());

では、スレッドを c.print();

で、以下のような問題が発生しています。 pthread_create(&t1, NULL, &c[0].print, NULL);

エラー Ouput: 'void* (tree_item:.) を変換できません。 )(void )' を 'void* ( )(void )' を 'int pthread_create(pthread_t*, const pthread_attr_t*, void* ( )(void ), void*)' に変更しました。

どのように解決するのですか?

C++のクラスメンバ関数には、隠し文字である this パラメータが渡されるからです。 pthread_create() がどのような値であるかは分からない。 this を使用することができないので、適切な型の関数ポインタにメソッドをキャストすることによってコンパイラを回避しようとすると、segmetnation faultが発生します。 静的なクラスメソッド(これには 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();
    }
};
...
C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);