如何正确地将参数传递给c多线程中的线程

时间:2010-11-19 00:17:17

标签: c multithreading parameters pthreads

我正在尝试学习C多线程,并且我已经看到了一些罕见的东西。

我知道将参数传递给线程必须使用指针完成。我找到了一个我不明白的例子。我将复制相关的行:

pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)

caracter显然是一个预先声明的功能。

现在,为什么我们使用void指针转换而不是int指针转换?有没有相关的区别?

其次,为什么我们首先使用指针式转换?我们不能像第一个参数一样使用“& n_veg”吗?

提前致谢。

2 个答案:

答案 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 *作为其最后一个参数。如果省略强制转换,编译器会给你一个警告。