代码之家  ›  专栏  ›  技术社区  ›  Aditya Sehgal

把一个论点当作无效*,合法吗?

  •  6
  • Aditya Sehgal  · 技术社区  · 14 年前

    我刚开始学习pthreads API,我正在学习教程 here

    但是,在一个示例程序中 pthread_create ,示例程序创建一个长变量, 传递其值 定型为 void* . 在thread entry函数中,它像一个long一样取消引用它。

    这合法吗? 我知道如果我传递变量的地址 t ,每个线程将作用于同一个变量,而不是其副本。我们能这样做吗,因为这是一个 空洞* 编译器不知道我们发送的是什么类型的文件?

    #include <pthread.h>
    #include <stdio.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);
          }
       }
       pthread_exit(NULL);
    }
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   GManNickG    14 年前

    这项工作只要 sizeof(long) <= sizeof(void*) 以及 long 可以表示为 void* .

    最好是传递变量的地址。你可以从 T* 空洞* 再次安全地返回。

        2
  •  4
  •   Community Jaime Torres    7 年前

    它和任何类型的打字一样合法。要点是,在对参数所指向的值进行类型转换之前,不能对其执行任何操作,因此 tid = (long)threadid .

    查看旧的问答 When to use a void pointer? .