我有一个与C ++和线程有关的问题。
我对Java的了解比对C ++的了解还要多,这个错误使我感到困惑。

想象一下,在x.h文件中,我有一个诸如以下的类:

class A{

    public A();

    public virtual void* func(void*);

    public virtual void func2();

    public virtual void func3();

};


在x.cpp文件中,我想这样做:

void* A::func(void*) {

    while(....)
        func2();

    return NULL;
}

void A::func2() {

    ...some stuff there...

}

void A::func3() {

    pthread_t t1;

    pthread_create(&t1, NULL, &A::func, NULL);

    void* result;

    pthread_join(t1,&result);

    ...some other stuff...

}


问题是它因以下错误而挂起:


  “错误:ISO C ++禁止使用不合格或不合格的地址
  带括号的非静态成员函数形成指向成员的指针
  功能。”


我应该怎么做才能解决这个问题?

谢谢。

最佳答案

这是一条糟糕的错误消息,但从根本上讲,它试图告诉您的是您无法通过实例方法形成函数指针(我不确定这里的Java术语是什么)。这是因为要调用实例方法,您需要实际代码的地址和对象的地址都为this,而常规函数指针仅存储前者。

这里需要的是一个static包装器方法,该方法与pthread_create对线程启动例程的期望相匹配。您将this作为第四个参数传递给pthread_create,包装器将其参数转换回对象指针并调用func。这种包装器通常称为“ thunk”,因为它使一种调用约定适合另一种调用约定。

class A {
    // ...
    static void* thread_start_thunk(void* self);
};

void*
A::thread_start_thunk(void* self)
{
    return static_cast<A*>(self)->func();
}

// ...

void
A::func3()
{
    // ....
    pthread_create(&t1, 0, &A::thread_start_thunk, static_cast<void*>(this));
    // ...
}


演员阵容是不可避免的。

关于c++ - 使用pthreads时如何在C++中将方法指针作为函数参数传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13725551/

10-11 23:01
查看更多