如何实现一个带有可变参数(n个参数)的函数,例如:void * thre(int,...);在pthread_create内部(& thr,NULL,thre,???) 提前致谢。pthread_create()中带有可变参数的函数?
0
A
回答
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
非常感谢你,这就是我需要的! –
我不太确定你想要什么,但解决的办法可能是使用软件工程的基本定理:添加一个间接的级别。 – StoryTeller
NVM,觉得我明白了。 – StoryTeller