2009-08-29 13 views
24

La cabecera de la función de pthread_create se ve así:¿Por qué start_routine para el retorno pthread_create void * y tomar void *

int pthread_create(pthread_t * thread, 
        const pthread_attr_t * attr, 
        void * (*start_routine)(void *), 
        void *arg); 

lo comprendo todo, excepto que el puntero de función para start_routine es de la forma void* (*fpointer) (void*) lo que significa que toma en void pointer y devuelve void pointer.

El puntero de vacío que se necesita es solo una forma de pasar un argumento al start_routine, obtengo esa parte, pero no entiendo por qué la función devuelve un puntero de vacío? ¿Qué código incluso notará ese puntero vacío?

Respuesta

27

De la documentación para pthread_create:

Se crea el subproceso en ejecución start_routine con arg como su único argumento. Si el start_routine regresa, el efecto es como si hubiera una llamada implícita a pthread_exit() usando el valor de retorno de start_routine como estado de salida. Tenga en cuenta que el hilo en el que main() se invocó originalmente difiere de esto. Cuando vuelve de main(), el efecto es como si hubiera una llamada implícita a exit() usando el valor de retorno de main() como estado de salida.

Y pthread_exit:

El pthread_exit() función termina el subproceso de llamada y hace que el valor value_ptr a disposición de cualquier éxito unirse con el hilo de terminación.

Así que si lo hace un pthread_join en un hilo, el puntero vuelve se pasa de nuevo a la rosca de unión, lo que le permite transmitir información desde el hilo de morir a otro, viviendo hilo.

7

Desde el spec:

Si los retornos start_routine, el efecto es como si no hubiera una implícita llamada a pthread_exit() utilizando el valor de retorno de start_routine como el estado salida.