Вы вернули указатель на локальную переменную. Это плохо, даже если потоки не задействованы.
Обычный способ сделать это, когда запускаемый поток - это тот же поток, который присоединяется, - передать указатель на int в местоположении, управляемом вызывающей стороной, в качестве 4-го параметра pthread_create. Затем он становится (единственным) параметром для точки входа потока. Вы можете (если хотите) использовать значение выхода из потока, чтобы указать успех:
#include <pthread.h>
#include <stdio.h>
int something_worked(void) {
/* thread operation might fail, so here's a silly example */
void *p = malloc(10);
free(p);
return p ? 1 : 0;
}
void *myThread(void *result)
{
if (something_worked()) {
*((int*)result) = 42;
pthread_exit(result);
} else {
pthread_exit(0);
}
}
int main()
{
pthread_t tid;
void *status = 0;
int result;
pthread_create(&tid, NULL, myThread, &result);
pthread_join(tid, &status);
if (status != 0) {
printf("%d\n",result);
} else {
printf("thread failed\n");
}
return 0;
}
Если вам абсолютно необходимо использовать значение выхода потока для структуры, то вам придется динамически распределять его (и убедиться, что тот, кто присоединяется к потоку, освобождает его). Это не идеально, хотя.