【问题标题】:Function with variable arguments in pthread_create()? [duplicate]pthread_create() 中带有可变参数的函数? [复制]
【发布时间】:2017-03-09 18:46:40
【问题描述】:

如何实现具有可变参数(n 个参数)的函数,例如:void *thre(int, ... );, inside pthread_create(&thr, NULL, thre, ???) 提前谢谢你。

【问题讨论】:

  • 我不确定你想要什么,但解决方案可能是使用软件工程的基本定理:添加一个间接级别。
  • NVM,我想我明白了。

标签: c pthreads


【解决方案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;
}

【讨论】:

  • @YasserNezzari - 如果我收集正确,那么是的。就像我在更新的代码中所做的那样。
  • 非常感谢,这正是我所需要的!
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多