2010-07-13 18 views
7

Estaba pasando por un re-entrancy guide en las prácticas recomendadas al escribir el código de reentrantes.Prácticas recomendadas para el código de reentrantes en C, C++

¿Qué otras referencias y recursos cubren este tema?

¿Qué herramientas con forma de pelusa se pueden utilizar para verificar estos problemas?

+0

que guían prácticamente tiene todo lo que necesita saber. No es algo muy sutil. No utilice datos que no se pasaron en la llamada a la función, no almacene ningún estado en la función. –

+1

Esa guía tiene numerosos errores, desde una definición de reentrada que en realidad es multithreading (aunque los ejemplos de procesamiento de señal son reentradas verdaderas) hasta malos consejos (mutexes ... hello deadlock) simplemente bugginess ('sigsuspend (& zeromask)'. . acabas de permitir el procesamiento de interrupciones que tu interlocutor desactivó por alguna razón, prueba con 'sigsuspend (& oldmask)' en su lugar). –

Respuesta

0

La guía es suficiente.

Mi regla personal de los pulgares sólo el 2 para el código re-volver a entrar son:

  1. sólo tienen pasan por los parámetros de valor, que se utiliza únicamente valor pasado como parámetros en la función.

  2. si necesito utilizar cualquier parámetro global o puntero (para rendimiento o almacenamiento), use un mutex o semáforo para controlar el acceso a él.

+0

Si necesita tipos complejos, hágalos inmutables si es posible – fmark

+0

Hola fmark: ¿me puede explicar más? ¿O señalarme algo relacionado con esta afirmación? – ttchong

+8

no No NO! Reentrancy! = Enhebrado. Los mutexes y los semáforos bloquearán el código de reentrada o, de lo contrario, dejarán de funcionar y dejarán la corrupción de los datos. –

1

Ninguno realmente. Escribir el código de no reentrada suele ser más difícil que volver a ingresar. Solo sigue esas sencillas instrucciones y no intentes hacer nada demasiado raro y estarás bien.

El código de no reentrada generalmente se escribe para problemas de alto rendimiento.

1
  • hace uso de variables locales.
  • No utilice locales estáticos o variables globales, incluso TLS no lo ayudará con la recursión/reentrada.
  • Restaure todas las invariantes antes de realizar devoluciones de llamada.
  • No mantenga bloqueos mientras hace devoluciones de llamada. Si es absolutamente necesario (y aún buscaría la manera de evitarlo), asegúrese de saber qué sucede si intenta volver a ingresar el bloqueo en el hilo que ya lo contiene. Como mínimo, debe probar esto, de lo contrario, dependiendo del bloqueo, obtendrá bloqueos o invariantes rotos (es decir, corrupción).
0
  1. Una función de reentrada no puede utilizar variables de una manera no-atómica a menos que sean almacenada en la pila de la tarea que llama o son las variables privadas de esa tarea.
  2. Una función de reentrada no puede llamar a otras funciones que no son reentrantes.
  3. Una función de reentrada no puede usar el hardware de una manera no atómica.

Ref: Página 462 [UNA INTRODUCCIÓN USO DEL RENESAS RX62N MICROCONTROLLER] [James M. Conrad]

Cuestiones relacionadas