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

问题描述:

我想学习C多线程,并且我已经看到了一些罕见的东西。如何将参数传递给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,线程可以free一旦完成。

+0

那么,传递一个真正的指针或者如果使用整数来转换值,是否有真正的区别? 而且,为什么*(int *)n_veg? 对不起,如果第二个问题是愚蠢的,这是我编程的第二年,直到本周才使用java:/ – bluehallu 2010-11-19 00:43:11

+1

@Hallucynogenyc:是的。如果你传入一个真实的指针,你可以使用指针改变原始值。关于'*(int *)n_veg':要使用'void *',您需要转换为实际类型,因此需要转换为'(int *)',然后'*'将引用指针以获取值。 – casablanca 2010-11-19 00:45:00

+0

全部清楚。非常感谢你! – bluehallu 2010-11-19 00:47:56

pthread_create定义如下:

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

所以它需要一个void *作为其最后一个参数。如果你省略了演员,编译器会给你一个警告。

+0

哦,这只是该方法要求...我认为无效指针是透明地操作该方法。算了吧。 – bluehallu 2010-11-19 00:28:03