Comprendiendo el uso del puntero a puntero presente en int pthread_join(pthread_t tid, void ** rval_ptr)
Recordemos el prototipo para una función invocable como hebra:
void * start_routine (void *);
En sus implementaciones lo esperable es concluir con algo del tipo:
return puntero_al_valor_retornado;
Por ejemplo:
void * testThread (void *) {
int * pInt;
pInt = malloc(sizeof(int)); /* notar
que la variable debe estar definida -existir- fuera del espacio de la
función */
*pInt = 45;
return (void *) pInt;
}
El problema a resolver es cómo leer ese valor desde un parámetro de salida de una función como es el caso en int pthread_join(pthread_t tid, void ** rval_ptr).
Supongamos que tenemos una función que genera un valor aleatorio el cual leemos a través de uno de sus parámetros.
Una invocación posible es:
Supongamos ahora que en lugar de un dato long, lo que deseamos leer es un valor de un puntero; es decir, en lugar de long, tenemos void *.
Si cambiamos long por void * en la misma función previa tendríamos:
void funcionEjemplo(void * * aleatorio) {
* *aleatorio = random();
}
Una invocación posible sería:
void * largo;
funcionEjemplo(&largo);
Así se explica el parámetro de la función pthread_join y el tipo de dato usado cuando es invocada.