我正在使用下面的函数,它将使用pthread_create()api作为单独的线程启动。
static void * threadFunc(void *arg)
{
char *s = (char *) arg;
printf("%s", s);
return (void *) strlen(s);
}
我的问题:
如果strlen(s)
的值是8(比如说),
在某些体系结构上,返回值存储在%eax中。在启动上述线程的pthread_join()调用中,此值8是否对主线程可见?
答案 0 :(得分:0)
1)不。 strlen在堆栈上返回size_t值(或在寄存器中返回,具体取决于体系结构)。 strlen不会分配任何内存来保存其结果。
2)将它的返回值转换为(void *)是一个非常糟糕的主意。您所做的只是获取size_t值(在您的示例中为8)并告诉编译器假装它是指向内存区域的指针。
这些都不是特定的pthread,只是正常的C.如果你想按预期使用void *,那就是你返回一个指向你已经分配的数据结构的指针,然后调用者需要释放它
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void *testFunc( char * );
void *testFunc( char *s ){
size_t *returnMemory = malloc( sizeof( size_t ) );
size_t len = strlen(s);
*returnMemory = len;
return returnMemory;
}
int main( int argc, char *argv[] ){
void *valPtr = testFunc( "Test String" );
size_t *sizePtr = (size_t *)valPtr;
printf( "%p => %zu\n", valPtr, *sizePtr );
exit(0);
}