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.


void funcionEjemplo(long * aleatorio) {
     * aleatorio = random();
}

Una invocación posible es:


long largo;
funcionEjemplo(&largo);

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.