3.8. PROBLEMAS POTENCIALES DE LOS HILOS.

  1. Consideraciones de programación.

Algunos autores, como John Ousterhout [OUS94], consideran que los hilos sólo deben emplearse cuando se desea y es posible una concurrencia verdadera, y no en entornos uniprocesador. Consideran que son demasiado complicados de usar para la mayoría de los programadores, incluso para los expertos, y plantean la programación con eventos como alternativa para la mayoría de los casos. Las problemas se deben a las siguientes causas :

  1. Complejidad : Aunque es cierto que la programación con hilos puede proporcionar una forma más natural de resolver los problemas, existen otras cosas que se deben tener en cuenta. La programación con hilos es más difícil que la clásica programación secuencial. Por ejemplo, cuando se mantiene, depura u optimiza una aplicación con hilos, se deben tener en cuenta la existencia de múltiples hilos de código en ejecución. Por ello generalmente es más fácil depurar y optimizar un programa de hilo simple.
  2. Sincronización : Se debe coordinar el acceso a los datos compartidos mediante bloqueos. Olvidar un bloqueo puede producir la corrupción de los datos.
  3. Posibilidad de deadlock : Las dependencias circulares en los bloqueos pueden originar deadlock.
  4. Depuración difícil, debido a las dependencias entre los datos y las dependencias de tiempo. Depurar en un sistema multiprocesador es más complicado, más costoso, y los errores no siempre son reproducibles. Una biblioteca de hilos puede ser útil para detectar y analizar errores en un entorno uniprocesador antes de ser probada en un sistema multiprocesador. Existen dos tipos de errores, los errores serie que pueden ocurrir en un entorno uniprocesador, y los errores paralelos que son inherentes a una ejecución paralela, y son difíciles de detectar.
  5. Rompen la abstracción, lo que impide diseñar módulos independientes.
  6. Obtener un buen rendimiento es difícil. Los bloqueos demasiado simples (grano grueso) disminuyen el nivel de concurrencia, mientras que los bloqueos de grano fino son demasiado complicados. Además la velocidad de cambio de contexto del sistema operativo influye notablemente en el rendimiento.
  7. Soporte escaso : El código es difícil de transportar a otras arquitecturas que no soportan hilos. Las librerías estándar no suelen ser hilo-seguras. Las llamadas al kernel o al sistema de gestión de ventanas pueden no estar preparadas para soportar múltiples hilos.
  8. Disponibilidad de herramientas : Para favorecer el desarrollo de aplicaciones multihilo, la industria necesitará crear herramientas de depuración y optimización más refinadas. Sin embargo, la tecnología de los depuradores y optimizadores es relativamente joven lo que a corto plazo supone un problema para los programadores. Un entorno de programación multihilo debe proporcionar depuradores con soporte multihilo [CAS90]. La información debe ser extraída del TCB (bloque de control del hilo) y hacerla disponible al usuario. Los cambios de contexto deberían ser visibles para el usuario. Por ejemplo, cuando se va a producir un cambio de contexto, el usuario podría elegir si continua depurando después del punto de suspensión o si cambia al contexto de otro hilo. Además se podrían presentar ventanas de depuración separadas para cada hilo dentro de un proceso.
  9. Utilización de código no seguro : Se debe tener mucho cuidado a la hora de mezclar código multihilo con código no hilo-seguro, es decir, código no preparado para ejecución en un entorno multihilo.

Consideraciones de programación.

Obviamente, la utilización de los hilos no es sencilla de cara al programador. Un entorno multihilo brinda ventajas, pero puede también incrementar la complejidad de la programación. Algunos problemas típicos encontrados por los programadores cuando trabajan con hilos son :