Reentrância: diferenças entre revisões
m r2.7.2) (Robô: A adicionar: ca:Codi reentrant |
|||
Linha 56: | Linha 56: | ||
[[uk:Повторновикористовна підпрограма]] |
[[uk:Повторновикористовна підпрограма]] |
||
[[zh:可重入]] |
[[zh:可重入]] |
||
GANGNAM STYLE |
Revisão das 19h43min de 19 de outubro de 2012
Em programação, reentrância refere-se a qualidade duma subrotina de ser executada concorrentemente de forma segura, isto é, a subrotina pode ser invocada enquanto está em execução. Para atenter essa qualidade, a subrotina não deve armazenar dados estáticos (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 subrotinas que também atendam as qualidades anteriores, isto é, que também sejam reentrantes.[1]
Vários níveis de prioridade de tarefas ou multiprocessamento geralmente complica 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
No código 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
GANGNAM STYLE