如何在C中将参数传递给pthread回调?

问题描述 投票:0回答:2

是否可以将参数传递给线程的回调?假设我创建了一个线程:

int main() {
  pthread_t t1;
  pthread_create(&t1, NULL, callback, 10);
  pthread_join(t1, NULL);
  return 0;
}

并且在callback中,我只想打印出10。我的问题现在是that as per the C pthread API,回调签名是

pthread

我可以将指向整数的指针传递给回调,如何传递?

c pthreads
2个回答
2
投票

您可以使用变量,例如:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

并且在 int val = 10; pthread_create(&t1, NULL, callback, &val); pthread_join(t1, NULL); ... 中:

callback

请注意,这是因为在等待void* callback(void *arg) { int i = *(int *)arg; .... return NULL; } 时,直到线程(val)完成执行之前,callback的生命周期才有效。否则,您可能希望动态分配内存(例如pthread_join())并将该对象传递给线程函数。


0
投票

对于不大于malloc的整数类型的单个值,可能并且相当普遍地将其强制转换为intptr_t调用中的指针,然后将其强制返回给线程函数:

pthread_create

这种铸造绝对是允许的,而且还是很常规的。

然而,最近我在SO上开始对此方法表示反对,但前提是C标准不需要int main() { pthread_t t1; pthread_create(&t1, NULL, callback, (void *) 10); pthread_join(t1, NULL); return 0; } void *t1(void *arg) { int arg_as_int = (int) arg; // ... } intvoid *的往返来保持价值。该论点正确地描述了C标准,但忽略了以下事实:实际上,强制转换方法首先在支持pthreads的每个C实现上都有效,并且它在不支持它的实现上也很常见可靠地将很难被接受。

© www.soinside.com 2019 - 2024. All rights reserved.