了解pthread上的困难

时间:2016-01-14 11:31:10

标签: c pthreads

我正在尝试理解pthreads,我正在编译我在网上找到的程序。

Here is a simple one

#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

非常感谢你们!

4 个答案:

答案 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:这是从pointerint的转换。

     

4:这是intpointer次转化。

你应该阅读一些关于线程的基础教程,并阅读一些关于C的书。