我正在尝试学习 C 多线程,并且我看到了一些罕见的东西。
我明白给线程传递参数必须用指针来完成。我找到了一个我不明白的例子。我将复制相关行:
pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)
caracter 显然是一个预先声明的函数。
现在,为什么我们使用 void 指针转换而不是 int 指针转换?有什么相关的区别吗?
其次,为什么我们首先使用指针转换?我们不能像第一个参数一样使用“&n_veg”吗?
提前致谢。
最佳答案
因为你的两个问题都是相关的,我会一起回答: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
,线程可以在完成后释放
它。
关于c - 如何正确地将参数传递给c多线程中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4221019/