函数的多个参数由pthread_create()调用 - 参数是函数指针

时间:2015-02-23 18:06:10

标签: c++ pthreads function-pointers argument-passing

我的情况类似于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的最后一个参数。

为什么?

2 个答案:

答案 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*的函数会导致未定义的行为。