我的情况类似于another Question。
我想传递函数作为参数和整数值。用简单的结构测试表壳:
void print (int x, int y)
{ cout << "x = " << x << ", y = " << y << endl; }
void *interrupt (struct arg_struct args);
struct arg_struct {
void (*func)(int,int); // Argument 1
int a; // Argument 2
int b; // Argument 3
};
int _tmain(int argc, _TCHAR* argv[]){
int a = 1700, b = 1000;
struct arg_struct arguments;
arguments.func = print;
arguments.a = a;
arguments.b = b;
(*interrupt)(arguments);
cin.get(); return 0;
}
void *interrupt (struct arg_struct args) {
void (*func) (int,int) ;
func = args.func;
int x = args.a;
int y = args.b;
(*func)(x,y);
return 0; // Erfordert Rückgabewert
}
所以现在我想创建一个线程来执行这个传递的函数。
void *InThread_func(struct arg_struct *); // Prototype
struct arg_struct {
void (*func)(int); // Argument 1
int IntNumber; // Argument 2
};
int InThread(void (*func)(int), int IntNumber){
struct arg_struct arguments;
arguments.func = func;
arguments.IntNumber = IntNumber;
// Initialize handler
pthread_t InThread_thread;
// Create thread
pthread_create(&InThread_thread,NULL,&InThread_func,(void*) &arguments);
pthread_join(InThread_func,NULL);
return(errno);
}
使用
g++-4.6 -o test test.cpp
编译器说
invalid conversion from void* (*)(arg_struct*) to void * (*)(void*)
引用pthread_create
的最后一个参数。
为什么?
答案 0 :(得分:1)
C ++在演员方面很挑剔。
将void *InThread_func(struct arg_struct *);
替换为void *InThread_func(void *my_data);
,它应该可以解决问题。
由于这是C ++,我建议您使用std::thread
,这些是您可以使用的。
答案 1 :(得分:1)
&#34;为什么?&#34;因为您的转化无效
也许是void* (*)( arg_struct* )
到void* (*)( void* )
。第三
pthread_create
的参数(不是最后一个)必须
extern "C" void* (*)( void* )
。 (有些编译器会忽略它
extern "C"
的必要性。他们在这方面被打破了。)所以
您的InThread_fnc
(我无法在您的代码中找到)必须是某种东西
像:
extern "C" void*
InThread_fnc( void* from_pthread_create )
{
arg_struct const* p = static_cast< arg_struct const* >( from_pthread_create );
(*p->func)( p->IntNumber );
return nullptr;
}
当然,这仅在pthread_create
的最后一个参数有效时才有效
一个arg_struct*
。这对应于您的情况,但请注意
开始派生:传递new Derived
或&someDerived
时
您开始强制转换为Base*
的函数会导致未定义的行为。