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 pthread_join retornara el valor de la función con prototipo como (sólo como supuesto, no es la forma en que trabaja este llamado):
void * pthread_join(pthread_t tid);
En este caso podríamos usar:
int * pValor;
pValor = pthread_join(tid);
Si embargo, pthread_join opta por int pthread_join(pthread_t tid, void ** rval_ptr) para leer el valor retornado por la hebra y con el fin de obtener el estado de éxito de la invocación a pthread_join().
Es así como pthread_join da acceso al valor retornado por la hebra a través de un parámetro de salida de la función.
Veamos un ejemplo simple para leer un valor a través de un parámetro de salida de una función.
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 la misma función anterior, pero que en lugar de un dato long lo que deseamos leer es un valor para 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 * l;
funcionEjemplo(&l);
Así se explica el parámetro de la función pthread_join y el tipo de dato usado cuando es invocada.