我正在尝试学习C多线程,并且我已经看到了一些罕见的东西。
我知道将参数传递给线程必须使用指针完成。我找到了一个我不明白的例子。我将复制相关的行:
pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)
caracter显然是一个预先声明的功能。
现在,为什么我们使用void指针转换而不是int指针转换?有没有相关的区别?
其次,为什么我们首先使用指针式转换?我们不能像第一个参数一样使用“& n_veg”吗?
提前致谢。
答案 0 :(得分:10)
由于您的两个问题都是相关的,我将一起回答:pthread_create
采用void *
参数,因此您可以真正传入任何您想要的指针。在这种情况下,我们实际上并没有传递指针,只是一个简单的整数值作为指针。这意味着您将在caracter
:
int value = (int)n_veg;
正如您所提到的,您可以将实际指针传递为&n_veg
并检索如下值:
int value = *(int *)n_veg;
事实上,在大多数情况下,您需要传递的数据不仅仅是整数,例如结构,在这种情况下,必须传递指针,因为您不能只需将它转换为类似整数的指针。
传递指针时要记住的一件事是,只要线程正在运行,n_veg
就不能超出范围。例如,如果你这样做:
void test() {
int n_veg;
pthread_create(&tid[n],NULL,caracter,&n_veg);
}
然后&n_veg
一旦test
返回就会无效,但线程可能仍在运行并且将保留无效地址。因此,传递给线程的结构通常是动态分配的,例如使用malloc
,一旦线程完成,线程就可以free
。
答案 1 :(得分:0)
pthread_create
定义如下:
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,
void *(*start_routine)(void *), void *restrict arg);
所以它期望void *
作为其最后一个参数。如果省略强制转换,编译器会给你一个警告。