Reentrância
Em programação, reentrância é quando uma subrotina é executada concorrentemente de forma segura; isto é, a subrotina pode ser invocada novamente por outra rotina reentrante mesmo que ainda esteja em execução. Para atender essa qualidade, a sub-rotina não deve armazenar dados estáticos (dados globais) não constantes - não deve retornar o endereço de dados estáticos não constantes - deve trabalhar somente com os dados fornecidos pela subrotina que a invocou, não deve contar com exclusão mútua para recursos construídos com o modelo singleton e, só deve invocar sub-rotinas que também atendam as qualidades anteriores, isto é, que também sejam reentrantes.[1] A reentrância é comum em sistema multiprogramável onde tecnicamente a função de um programa tem a capacidade de ser usado por muitos usuários ao mesmo tempo (compartilhado) tendo somente uma cópia do programa sendo executado na memória do dispositivo computacional (somente uma instância).[2]
Vários níveis de prioridade de tarefas ou multiprocessamento geralmente complicam o controle de código reentrante. Código de entrada/saída geralmente não é reentrante pois manipula recursos singleton como discos rígidos. Entretanto, a reentrância é uma funcionalidade importante da programação funcional.
Exemplos
[editar | editar código-fonte]No código da linguagem de programação C à esquerda, as funções f
e g
não são reentrantes. Note que f
depende da variável global g_var
. Portanto, se duas threads executarem a função e acessarem g_var
concorrentemente, o resultado é indeterminado, dependerá da sequência de execução. Como g
invoca f
, ela também não é reentrante. Por outro lado, o código à direita é uma versão alterada do algoritmo não reentrante que elimina o uso do recurso estático, tornando ambas as funções reentrantes.
int g_var = 1;
int f()
{
g_var = g_var + 2;
return g_var;
}
int g()
{
return f() + 2;
}
|
int f(int i)
{
return i + 2;
}
int g(int i)
{
return f(i) + 2;
}
|
Referências
- ↑ Dipak Jha (20 de janeiro de 2005). «Use reentrant functions for safer signal handling» (em inglês). IBM. Consultado em 9 de julho de 2008
- ↑ Sobral, João Bosco Mangueira. «Programação Paralela e Distribuída: Programação Concorrente (INE 5645)». Departamento de Informática e de Estatística (INE), Universidade Federal de Santa Catarina (UFSC). Consultado em 26 de abril de 2024. Resumo divulgativo