Hilos | El uso de hilos y cuatro métodos de implementación.

1. Implementación del hilo

1. Hilos a nivel de usuario

La sobrecarga es pequeña y el espacio de usuario puede crear varios. La desventaja es que el kernel no puede detectar la existencia de múltiples subprocesos a nivel de usuario y lo trata como un solo subproceso, por lo que solo proporcionará un procesador.

2. Hilos a nivel de kernel

Ligeramente más caro que el nivel de usuario y puede aprovechar múltiples procesadores.

3. Hilos de nivel combinado

Implementación de hilos en Linux en diferentes plataformas:

El mecanismo por el cual Linux implementa subprocesos es muy singular. Desde la perspectiva del kernel, no tiene el concepto de subprocesos. Linux implementa todos los hilos como procesos. El kernel no prepara algoritmos de programación especiales ni define estructuras de datos especiales para representar subprocesos. En cambio, un hilo se ve simplemente como un proceso que comparte ciertos recursos con otros procesos. Cada hilo tiene su propia estructura de tarea única, por lo que en el kernel parece un proceso normal (solo que el hilo comparte ciertos recursos, como el espacio de direcciones, con algunos otros procesos).

2. Uso de hilos

2.1 Interfaz de biblioteca de subprocesos: función pthread

1)pthread_create

#include <pthread.h>

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

pthread_create() crea un nuevo hilo, similar a la función fork que crea un nuevo proceso


Parámetro 1: pthread_t *thread: un puntero a datos de tipo pthread_t. Cuando se crea un hilo, se escribirá un identificador en la variable apuntada por este puntero. Usamos este identificador para referirnos al nuevo hilo; hilo: recibe el nuevo hilo creado
. El ID del hilo, de acuerdo con diferentes nombres de ID, administra el hilo correspondiente.
Parámetro dos: const pthread_attr_t *attr
attr: especifica los atributos del hilo. Generalmente, no se establecen atributos especiales. Establezca este parámetro en NULL ;
Parámetro tres: void *( *start_routine) (void *): el parámetro es un puntero de tipo void y el valor de retorno también es la dirección de función del puntero a void. Le dice al nuevo hilo que comience la ejecución desde la ubicación señalada por este puntero de función.
start_routine: la función de subproceso especificada que iniciará el subproceso
Parámetro cuatro: void *arg: puntero de parámetro pasado a la función de subproceso
arg: parámetros pasados ​​a la función de subproceso

//Devuelve 0 en caso de éxito, código de error en caso de error

2)pthread_join

int pthread_join(pthread_t thread, void **retval);

pthread_join() espera a que salga el hilo especificado por el hilo. Si el hilo no sale, este método se bloquea. Equivalente a la función de espera utilizada en el proceso para recopilar información de salida de procesos secundarios.

Parámetro uno: hilo pthread_t: especifica el hilo que se esperará (aquí se usa el nombre de la variable pthread_t),
parámetro dos: void **retval: es un puntero, que apunta a otro puntero, que apunta a la información de salida del hilo.

//Devuelve 0 en caso de éxito, código de error en caso de error

3)pthread_exit

int pthread_exit(void *retval);

pthread_exit() Un hilo finaliza la ejecución llamando a esta función. Equivale a llamar a la función de salida cuando finaliza el proceso.

Parámetros: void *retval: un puntero a la información de salida del hilo o un puntero a un objeto devuelto cuando el hilo sale. El objeto no puede ser un objeto local, porque después de que finaliza esta función, la variable local no existe, lo que provocará la programa a fugas.

Supongo que te gusta

Origin blog.csdn.net/weixin_53472334/article/details/132327736
Recomendado
Clasificación