2017-03-09 64 views

回答

1

设置了线程处理函数的原型。它必须是void* (*)(void*)。你不能传递一个接受别的东西的函数,即使是在投射时也是如此,因为这将是未定义行为的原因。

但POSIX允许你单个参数void*,这个参数足以传递任何东西的地址,因此不是那种限制。

所以,如果你想传递一些额外的参数,他们捆绑在一个结构:

struct my_data { 
    int n; 
    char c; 
    double d; 
}; 

void *variable_argument_function (int first_arg, ...) { 
    return NULL; 
} 

void* handler(void *vdata) { 
    struct my_data *data = vdata; 

    return variable_argument_function(data->n, 
            data->c, 
            data->d); 
    //use data->n, data->c, data->d 
} 

int main(void) { 
    struct my_data t_data = { 
    .n = 1, .c = 'a', .d = 3.14 
    }; 

    pthread_t t; 
    if (pthread_create(&t, NULL, &handler, &t_data) == 0) 
    pthread_join(t, NULL); 

    return 0; 
} 
+0

@YasserNezzari - 如果我收集正确,那么是的。就像我在更新的代码片段中那样做。 – StoryTeller

+0

非常感谢你,这就是我需要的! –