【问题标题】:Understanding difficulties on pthread理解 pthread 上的困难
【发布时间】:2016-01-14 11:31:10
【问题描述】:

我正在尝试了解 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

非常感谢大家!

【问题讨论】:

  • 确实知道指针是如何声明的吗?你确实知道通用指针void *吗?现在再次查看PrintHello 函数声明。如果你知道通用指针,现在是时候去你最喜欢的搜索引擎做一些搜索了。

标签: c pthreads


【解决方案1】:

1)“*PrintHello”函数名有点像指针(因为 星号)?

它的函数,返回指向 void 的指针。即void *

2)函数的参数是一个没有类型的指针?所以……甚至没有 指针?

没错。线程函数一个take void指针。

3)我们如何将 void 类型的变量转换为 long?

这是从指针类型到整数类型的转换。这种转换是实现定义的,并且可能未定义。这将适用于当今的大多数实现,但绝不是完全可移植的。

4) 我们不能构建一个更简单的函数并将其传递给 线程?

没有。因为pthread_create() 函数特别需要一个函数指针,它接受void* 参数并返回void*。所以你不能传递不同的功能。

5) 最后在 main 中,在 pthread 函数中,(void *)t 是做什么的 参数是什么意思?

这是整数到指针的转换。 (3) 中的相同 cmets 适用于此。

【讨论】:

    【解决方案2】:

    PrintHello() 是一个函数,它接受void* 参数并返回void* 值。

    如果仍有疑问,请阅读Kernighan and Ritchie 学习 C 编程。

    【讨论】:

      【解决方案3】:

      1:线程函数需要有一个void*返回类型,因为void指针可以用来指向内存中的任何数据。

      2:是的,没错。

      3:这是从pointerint 的转换。

      4:这是intpointer 的转换。

      你应该阅读一些关于线程的基本教程和一些关于 C 的书籍。

      【讨论】:

        【解决方案4】:

        在深入研究并行性之前,您应该学习一点 C 语言。这样你的学习就会轻松很多: void pointer 是通用指针。在void 指针上查看this 教程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-14
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多