0

スレッド化のための非常に単純なコードを作成しました。私はこれに非常に慣れていないので、言及されたエラーについてはわかりません。

class opca_hello
{
 public:
void hello();
}

void opca_hello::hello()

{
printf ("hello \n");
}


int main(int argc, char **argv)
{
opca_hello opca;
pthread_t thread1, thread2;
pthread_create( &thread1, NULL, opca.hello, NULL);
pthread_join( thread1, NULL);
return 0;
}

エラー: タイプ "void (opca_hello::)()" の引数が "void* (*)(void*)" と一致しません

4

1 に答える 1

3

メンバー関数へのC++呼び出しは、残りの引数とともにこれへのポインターを渡す必要があります。

したがって、スレッドを使用するには、次のようなコードを記述します。

static void *start(void *a)
{
    opca_hello *h = reinterpret_cast<opca_hello *>(a);
    h->hello();
    return 0;
}

pthread_create( &thread1, NULL, start, &opca);

PS:

メソッドにパラメーターを渡す必要がある場合は、次のようにします(たとえば)。

struct threadDetails {opca_hello * obj; int p; };

static void *start(void *a)
{
    struct threadDetails *td = reinterpret_cast<struct threadDetails *>(a);
    td->obj->hello(td->p);
    delete td;
    return 0;
}

それで:

struct threadDetails *td = new struct threadDetails;
td->obj = &opca;
td->p = 500;
pthread_create( &thread1, NULL, start, td);
于 2013-03-11T05:09:33.560 に答える