0

在下面的链接中

https://computing.llnl.gov/tutorials/pthreads/samples/hello.c

在语句rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);中,编码器刚刚传递了一个变量作为第四个参数,而没有传递该变量的地址。这段代码正确吗?如果是,我们如何将变量转换为void *

上面的链接似乎很受欢迎,因为它首先在 Google 中列出了 pthreads。

4

3 回答 3

1

好吧,这有点奇怪,但它做了它应该做的事情。

第四个参数作为参数发送给 PrintHello 函数/例程。它必须作为void *.

通常,您有一个指向您强制转换为的动态分配对象的指针void *。但是在这里他定义了 a long t,将其转换为void *(address) 并将其发送。然后他将其转换回longPrintHello 中的 a,所以一切都很好,但有点难看,如果他将它转换为“可怕”的错误指向一个指针并试图访问它指向的内存。

于 2013-07-11T23:50:03.593 回答
0

是的,如果您不尝试访问线程中参数指向的内存,则此代码是正确的。只需将其转换为线程中的 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);
}

但这需要使用mallocfree

请记住,指针只不过是一个 32 位或 64 位无符号整数,它表示内存中的一个位置,您可以将任何数字放入指针中,只是不要尝试访问它指向的内存。

希望有帮助,

-戴夫

于 2013-07-11T23:47:21.630 回答
0

实际上第 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 ...
}
于 2013-07-15T14:06:45.143 回答