2011-12-15 28 views
35

Tengo una pregunta sobre la programación de concurrencia C.pthread_join() y pthread_exit()

En la biblioteca pthread, el prototipo de pthread_join es

int pthread_join(pthread_t tid, void **ret); 

y el prototipo de pthread_exit es:

void pthread_exit(void *ret); 

así que estoy confundido, ¿por qué pthread_join toma el valor de retorno del proceso como un puntero a un puntero void de hilo cosechado, pero pthread_exit solo toma un puntero void del subproceso salido? Quiero decir, básicamente, son todos los valores de retorno de un hilo, ¿por qué hay una diferencia en el tipo?

Respuesta

32

En pthread_exit, ret es un parámetro de entrada. Simplemente está pasando la dirección de una variable a la función.

En pthread_join, ret es un parámetro de salida. Obtienes un valor de la función. Tal valor puede, por ejemplo, establecerse en NULL.

larga explicación:

En pthread_join, a recuperar la dirección pasó a pthread_exit por el hilo acabado. Si pasa solo un puntero, se pasa por valor para que no pueda cambiar hacia dónde apunta. Para poder cambiar el valor del puntero pasado a pthread_join, se debe pasar como un puntero en sí mismo, es decir, un puntero a un puntero.

+0

Pero por qué definir ret en '' pthread_exit' un tipo void * ',' It'a siempre null' o algunos otros valores constantes – stonestrong

3

El uso típico es

void* ret = NULL; 
pthread_t tid = something; /// change it suitably 
if (pthread_join (tid, &ret)) 
    handle_error(); 
// do something with the return value ret 
25

Es porque cada vez que

void pthread_exit(void *ret); 

se llamará a partir de la función de la rosca, para el que alguna vez desea volver simplemente su pase puntero con pthread_exit().

Ahora en

int pthread_join(pthread_t tid, void **ret); 

será siempre llama desde donde se crea la rosca, para aquí para aceptar que volvió puntero que necesitan doble puntero ..

creo que este código le ayudará a entender este

#include<stdio.h> 
#include<pthread.h> 
#include<stdlib.h> 

void* thread_function(void) 
{ 
    char *a = malloc(10); 
    strcpy(a,"hello world"); 
    pthread_exit((void*)a); 
} 
int main() 
{ 
    pthread_t thread_id; 
    char *b; 

    pthread_create (&thread_id, NULL,&thread_function, NULL); 

    pthread_join(thread_id,(void**)&b); //here we are reciving one pointer 
             value so to use that we need double pointer 
    printf("b is %s",b); 
    free(b); // lets free the memory 

} 
+5

pérdida de memoria .... – gliderkite

+0

¿Cómo liberar un en este caso? ¿O cómo evitar la fuga de memoria de esta manera? – ponypaver

+0

'libre (b);' justo después de 'printf (" b es% s ", b);' si no me equivoco. –

Cuestiones relacionadas