2012-01-15 21 views
10

Duplicar posibles:
Malloc thread-safe?malloc() no es reentrante pero es seguro para subprocesos?

No soy un poco confundido mientras estoy leyendo "La interfaz de programación de Linux".

Del libro se dice que malloc no es reentrante, ya que manipula la estructura de datos de la lista global enlazada, pero se hace seguro de subprocesos mediante el uso de mutex.

Estoy un poco confundido acerca de esto: ya que es seguro para subprocesos con el uso de mutex y por lo tanto puede ser invocado por más de un subprocesos al mismo tiempo, ¿por qué no es una función de reentrada? (si decimos que reentrant significa que puede ser invocado por más de un llamante al mismo tiempo)

Otra cuestión es que, como malloc es seguro para subprocesos, ¿podemos ponerlo en un manejador de señal? Creo que la respuesta es sí, pero no estoy seguro ya que según este libro, dice que solo se puede poner una función de reentrada o de seguridad de señal asincrónica en el controlador de señal.

Puede alguien explicar esto a mí?

+0

¿El mutex está incluido en la implementación de malloc? – Bingo

Respuesta

23

si decimos que reentrada significa que puede ser invocada por más de una persona que llama al mismo tiempo

incorrecto. Reentrant significa puede interrumpirlo y volver a llamarlo antes de que la encarnación anterior haya finalizado. Imagínese malloc se ve así:

lock(mutex); 

/* Stuff. */ 

unlock(mutex): 

¿Qué ocurre si se interrumpe en el medio, antes de desbloquear y alguien llama a malloc?

  • El primer contexto no puede continuar hasta que el segundo se realiza
  • los segundos bloques de contexto en el mutex y no puede continuar hasta que el primero desbloquea el mutex

Eso es un callejón sin salida.

Otra pregunta es que, como malloc es seguro para subprocesos, ¿podemos ponerlo en un manejador de señal? Creo que la respuesta es sí

Error de nuevo. Vea el ejemplo de arriba. Imagine que el programa principal está haciendo un malloc y antes de que la función realmente finalice, su manejador llama a malloc.

+0

Gracias cnicutar, la respuesta es MUY CLARA !! – kai

+0

@kai: Tenga en cuenta que el problema (confundir estos conceptos) se ve agravada por el hecho de que las versiones anteriores de POSIX (pre-2008) utilizan erróneamente la palabra de reentrada en el sentido de flujos seguros ... –

2

La reentrada y la seguridad de hilos son dos conceptos diferentes. Una función de reentrada puede no ser segura para la ejecución de subprocesos y una función de seguridad de subprocesos puede ser no reentrante.

No se garantiza la reentrada de las funciones de biblioteca en C y solo las funciones de reentrada pueden invocarse desde controladores de señal.

+0

'Una función de reentrada puede ser no a prueba de hilos' ... ¿Puede? –

+4

@iuliux: Sí. En algunas máquinas, las variables estáticas son más rápidas que las variables locales basada en la pila. Código que en las copias de entrada de sus variables estáticas a la pila, utiliza las variables estáticas, y luego restaura las variables de la pila será re-entrante, pero no seguro para subprocesos. – supercat

Cuestiones relacionadas