在下面的链接中
https://computing.llnl.gov/tutorials/pthreads/samples/hello.c
在语句rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
中,编码器刚刚传递了一个变量作为第四个参数,而没有传递该变量的地址。这段代码正确吗?如果是,我们如何将变量转换为void *
上面的链接似乎很受欢迎,因为它首先在 Google 中列出了 pthreads。
在下面的链接中
https://computing.llnl.gov/tutorials/pthreads/samples/hello.c
在语句rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
中,编码器刚刚传递了一个变量作为第四个参数,而没有传递该变量的地址。这段代码正确吗?如果是,我们如何将变量转换为void *
上面的链接似乎很受欢迎,因为它首先在 Google 中列出了 pthreads。
好吧,这有点奇怪,但它做了它应该做的事情。
第四个参数作为参数发送给 PrintHello 函数/例程。它必须作为void *
.
通常,您有一个指向您强制转换为的动态分配对象的指针void *
。但是在这里他定义了 a long t
,将其转换为void *
(address) 并将其发送。然后他将其转换回long
PrintHello 中的 a,所以一切都很好,但有点难看,如果他将它转换为“可怕”的错误指向一个指针并试图访问它指向的内存。
是的,如果您不尝试访问线程中参数指向的内存,则此代码是正确的。只需将其转换为线程中的 long 即可。
tid = (long)threadid;
它将指针转换为long,但它不会触及指针指向的内存空间,这很可能是垃圾并且会导致访问冲突。
例如,如果您这样做:
tid = (long)*threadid;
这将导致访问冲突,因为您试图访问 threadid 指向的位置的内存。
如果您宁愿将指针传递给长整数,则可以执行类似的操作。
...
long* pint = (long*)malloc(sizeof(long));
*pint = t;
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)pint);
void *PrintHello(void *threadid)
{
long* tid;
tid = (long*)threadid;
printf("Hello World! It's me, thread #%ld!\n", *tid);
free(tid);
pthread_exit(NULL);
}
但这需要使用malloc
和free
请记住,指针只不过是一个 32 位或 64 位无符号整数,它表示内存中的一个位置,您可以将任何数字放入指针中,只是不要尝试访问它指向的内存。
希望有帮助,
-戴夫
实际上第 4 个参数是要传递给线程的参数,例如,如果有一个值需要从主线程传递给新创建的线程,那么这是通过第 4 个参数完成的。例如:
假设我从主循环创建了一个线程:
Int32 l_threadid = pthread_create(&l_updatethread,NULL,Thread,&l_filter);
如您所见,我正在传递一个值的地址,该值将在以下列方式创建的线程中使用:
void* Thread(void *p_parameter)
{
int *l_thread_filter = (int *)p_parameter;
.... then play around with this variable ...
}