C/C++
Directorio de artículos
Seguridad de subprocesos y reentrada de funciones
Reentrante y seguro para subprocesos, estos dos son conceptos completamente diferentes;
Las funciones reentrantes solo pueden ocurrir bajo señal. Por ejemplo, una función se interrumpe durante la ejecución y se llama nuevamente en la función de procesamiento de interrupciones. Estas dos llamadas (cada una) pueden producir resultados correctos, por lo que la función de entrada reentrante;
función reentrante
Vea un ejemplo no reentrante:
void sig_handler(int sig)
{
...
gethostbyname("www.baidu.com");
....
alarm(1);
}
int main()
{
signal(SIGALRM,sig_handler);
alarm(1);
while(1){
....
gethostbyname("www.google.com");
printf(...);
}
return 0;
}
La implementación interna de gethostbyname tiene una variable local estática o una variable global estática;
Esto significa que la llamada a gethostbyname en main acaba de ejecutarse o solo se ejecutó a medias. En este momento, llega la señal, vaya a sig_handler y continúe llamando a gethostbyname. Dado que la implementación es una variable estática, la llamada posterior a gethostbyname sobrescribirá los datos anteriores.
Por lo tanto, es concebible que si una función utiliza variables estáticas/globales para el procesamiento de datos o devuelve esta variable estática/global, debe ser una función no reentrante;
seguridad del hilo
En pocas palabras, es una operación de bloqueo,
por lo que las funciones seguras para subprocesos deben ser reentrantes. La respuesta es no.
Por ejemplo:
malloc es seguro para subprocesos, operará una lista enlazada global, una vez que sea interrumpido por sigal durante la ejecución, finalizará directamente
pthread_mutex_lock es seguro para subprocesos. Una vez que se interrumpe el proceso de ejecución, otro pthread_mutex_lock puede bloquear o destruir directamente el estado interno durante el procesamiento de interrupción.
Por ejemplo: ¿Es seguro para subprocesos? ¿Se puede ejecutar correctamente después de una interrupción?
int func(){
static int i = 0;
lock ;
++i;
unlock ;
return i;
}
En resumen, la seguridad de los subprocesos y la reentrada son dos conceptos, aunque existen algunas intersecciones entre ellos;
Si se usa una variable estática/global en una función, es básicamente una función no reentrante, por supuesto, depende de la implementación; si se agrega esta función
lock, entonces es seguro para subprocesos, si las variables estáticas/globales también se eliminan internamente y no se realizan llamadas adicionales a funciones no reentrantes, entonces es un
Funciones que son seguras para subprocesos y reentrantes.
Finalmente, ¿una función reentrante es una función segura para subprocesos?
No necesariamente; pero en general las funciones reentrantes son seguras para subprocesos,
razón:
Piénselo usted mismo, la característica de las funciones no reentrantes es [usar o devolver variables estáticas/globales o usar funciones no reentrantes adicionales]
Entonces la función reentrante no debe llamar ni usar esas cosas,