查询C中线程函数的返回值

时间:2014-06-06 12:33:55

标签: c multithreading assembly pthreads

我正在使用下面的函数,它将使用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是否对主线程可见?

1 个答案:

答案 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);
}