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.


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

Una invocación posible es:


long l;
funcionEjemplo(&l);

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.