繁体   English   中英

c多线程编程中的pthread_create参数

[英]pthread_create argument in c multi thread programming

pthread_create(&Thread,NULL,ChildThread,(void *)100);

1)我们可以传递pthread_create的第4个参数,如上所示? 它不应该是指针变量吗?

只是一个例子( not meant to be correct way of doing it; but to serve as example code for anyone who want to play with it ):

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <pthread.h>

void *print_number(void *number) {
    printf("Thread received parameter with value: %d\n", number);
    return (void *)number;
}

int main(int argc, char *argv[]) {
    pthread_t thread;
    void *ret;
    int pt_stat;
    pt_stat = pthread_create(&thread, NULL, print_number, (void *)100);
    if (pt_stat) {
        printf("Error creating thread\n");
        exit(0);
    }

    pthread_join(thread, &ret);
    printf("Return value: %d\n", ret);

    pthread_exit(NULL);

    return 0;
}

如果指针值大于int可以容纳的值,这将导致未定义的行为。 从C99看到这个引用:

Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.

What (void *)100表示取整数值100并将其视为指向某些未指定类型的内存的指针(即(void *) )。 在这种情况下,这意味着将堆栈上的整数值100作为pthread_create的参数。 据推测, ChildThread将传递给它的void *转换回int ,然后将其用作数字。

从根本上说,指针实际上只是内存地址。 内存地址只是一个描述内存中位置的数字,因此将int转换为任何类型的指针都是合法的。 在某些情况下,将int转换为指针绝对是正确的做法和要求,但是,它们往往很少见。 例如,如果您正在为嵌入式控制器编写代码,并且想要为内存映射I / O设备编写驱动程序,那么您可以将设备的基址转换为指向int或struct的指针,然后通过正常的C访问来执行访问设备的指针。 int转换为指针的另一个例子是实现低级虚拟内存管理例程,以便为操作系统分配物理内存。

您提供的代码并不常见,并且可以正常工作,假设指针的大小至少足以容纳您尝试传递的整数。 大多数实现pthread_create系统可能都有32位或64位指针,因此您的示例很可能会起作用。 恕我直言,这有点滥用,因为在这种情况下100可能不会引用内存位置,并且C不保证void *足以容纳int

取自POSIX线程Progreamming的优秀artice 必须阅读任何新手。

Example Code - Pthread Creation and Termination

#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);
      }
   }

   /* Last thing that main() should do */
   pthread_exit(NULL);
}

说明:

您可以将100作为第4个参数传递给pthread_create() 在PrintHello函数中,您可以将void *转换回正确的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM