是否可以将参数传递给线程的回调?假设我创建了一个线程:
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
我可以将指向整数的指针传递给回调,如何传递?
您可以使用变量,例如:
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()
)并将该对象传递给线程函数。
对于不大于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;
// ...
}
到int
到void *
的往返来保持价值。该论点正确地描述了C标准,但忽略了以下事实:实际上,强制转换方法首先在支持pthreads的每个C实现上都有效,并且它在不支持它的实现上也很常见可靠地将很难被接受。