我有一个与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/