pthread_create(&Thread,NULL,ChildThread,(void *)100);
1) 我们可以像上图那样传递 pthread_create 的第四个参数吗?它不应该是一个指针变量吗?
只是一个例子(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.
意思(void *)100
是取整数值 100 并将其视为指向某些未指定类型的内存(即(void *)
)的指针。在这种情况下,这意味着将整数值 100 作为参数压入堆栈pthread_create
。据推测,ChildThread
将void *
传递给它的内容转换回 a int
,然后将其用作数字。
从根本上说,指针实际上只是内存地址。内存地址只是一个描述内存位置的数字,因此将 anint
转换为任何类型的指针都是合法的。在某些情况下,将指针转换int
为指针绝对是正确的做法并且是必需的,但是它们往往很少见。例如,如果您正在为嵌入式控制器编写代码,并且想要为内存映射 I/O 设备编写驱动程序,那么您可以将设备的基地址转换为指向 int 或 struct 的指针,然后通过正常的 C 访问访问设备的指针。将 s 转换为指针的另一个示例int
是实现低级虚拟内存管理例程以分配操作系统的物理内存。
您提供的代码并不少见,并且可以工作,假设指针的大小至少足以容纳您尝试传递的整数。大多数实现的系统pthread_create
可能会有一个 32 位或 64 位指针,所以你的例子很可能工作。恕我直言,这有点滥用,因为在这种情况下 100 可能不指代内存位置,并且 C 不保证 avoid *
大到足以容纳 a int
。
摘自一篇关于POSIX Thread Progreamming的优秀文章。任何新手都必须阅读。
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 作为第四个参数传递给pthread_create()
. 在函数 PrintHello 中,您可以将 void* 类型转换回正确的类型。