Seguridad de subprocesos y reentrada de funciones

C/C++



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,

Supongo que te gusta

Origin blog.csdn.net/zyq880625/article/details/132040595
Recomendado
Clasificación