我正在尝试理解pthreads,我正在编译我在网上找到的程序。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
/* Last thing that main() should do */
pthread_exit(NULL);
}
所以我无法理解PrintHello函数的语法。
1)“ * PrintHello ”函数名称类似o指针(因为星号)?
2)函数的参数是一个没有类型的指针?那么......甚至不是指针?
3)我们如何将变量的void类型转换为long?
我们是否无法构建更简单的函数并将其传递给线程?
4)最后在main,在pthread函数中,(void *)t 参数是什么意思? :o
非常感谢你们!
答案 0 :(得分:3)
1)“* PrintHello”函数名称类似于指针(因为 明星符号)?
这是函数,返回指向void的指针。即void *
。
2)函数的参数是没有类型的指针?所以......甚至没有 指针?
这是对的。线程函数 取一个空指针。
3)我们如何将void类型的变量转换为long?
这是从指针类型到整数类型的转换。此转换是实现定义的,可能未定义。这将适用于当今的大多数实现,但绝不是完全可移植的。
4)我们是否无法构建更简单的函数并将其传递给 线程?
没有。因为pthread_create()函数特别期望一个函数指针采用void*
参数并返回void*
。所以你不能传递不同的功能。
5)最后在main中,在pthread函数中,(void *)t是什么 参数意味着什么?
这是指针转换的整数。 (3)中的相同评论适用于此。
答案 1 :(得分:2)
PrintHello()
是函数,接受void*
参数并返回void*
值。
如果怀疑仍然存在,请阅读Kernighan and Ritchie以学习C编程。
答案 2 :(得分:1)
在深入并行化之前,你应该学习一些C语言。这样你的学习就会轻松多了:
void pointer
是通用指针。查看void
指针上的this教程。
答案 3 :(得分:1)
1:线程函数需要具有
void*
返回类型,因为void
指针可用于指向内存中的任何数据。2:是的,这是正确的。
3:这是从
pointer
到int
的转换。4:这是
int
到pointer
次转化。
你应该阅读一些关于线程的基础教程,并阅读一些关于C的书。