2010-03-28 36 views
5

Tengo que simular un juego en el que cada jugador tiene turnos y necesita 'prestar atención' a lo que está sucediendo.Múltiples hilos o procesos con hilos

Hasta ahora, sé que necesitaré dos hilos para cada jugador, uno que dormirá hasta el turno del jugador y el otro prestando atención.

Mi pregunta es: ¿Debo trabajar cada jugador como un 'tenedor' y los hilos en la horquilla, o simplemente crear algunos hilos para el jugador y asociarlos de alguna manera?

Es la primera vez que trabajo con simultaneidad, semáforos e hilos, por lo que no estoy seguro de las buenas prácticas y el estilo de programación.

+0

Supongo que su tarea es que use un hilo por jugador. Si es así, debe dejar eso en claro en su pregunta. Además, ¿cada jugador es una persona y el hilo de su interfaz para el juego, o es el hilo del jugador? Además, ¿en qué plataforma tienes que ejecutar esto? Supongo que algunos * nix. – nategoose

+0

@nateg, ya que no requiere código, la plataforma es casi irrelevante. –

+0

@Henk: ¿Windows tiene un tenedor()? Creo que la plataforma es relevante en ese nivel de abstracción. – Duncan

Respuesta

3

Usted ha tropezado con los bordes de una gran guerra religiosa, que gira en torno a la cuestión

programas basados ​​en eventos deben ser escritos usando múltiples hilos o el uso de un solo bucle evento?

El campo de hilos cree que las entidades individuales, como "jugadores", se programan con más facilidad cuando se escribe como hilos reales, posiblemente explcitly renunciar al procesador cuando ya no se necesitan. La información sobre el estado del jugador se puede almacenar en variables locales e incluso en el contador del programa. Pero con los hilos puede que tenga que preocuparse por la atomicidad, el punto muerto y otras alegrías de la programación concurrente.

El campo impulsado por eventos cree que es mucho más simple obtener una aplicación completa cuando todas las entidades son capaces de responder a cada evento, y esa entidad obtiene el control total del procesador por el tiempo que necesita para procesar el evento (que mejor debe ser finito, y por lo general es mejor que sea corto). No hay preocupaciones sobre concurrencia porque cada controlador de eventos se ejecuta atómicamente, pero hay un costo de programación: cuando el controlador de eventos finaliza, todos sus procedimientos finalizan, por lo que la información sobre su estado debe almacenarse en los campos de un objeto asignado en el montón.

La historia de los hilos tiende a brillar cuando una entidad tiene un flujo de control complejo o quiere usar mucha abstracción — ambos son difíciles de codificar sin hilos. La historia de los eventos tiende a brillar cuando los manejadores son bastante simples — es genial tener todos los manejadores ejecutándose atómicamente sin tener que preocuparse por ello, y simplifica la comunicación entre las entidades.

Antes de continuar con su tarea, averigüe a qué grupo religioso pertenece su instructor.

Como ha preguntado acerca de los hilos, recomiendo encarecidamente las bibliotecas de hilos y canales en Dave Hanson's C Interfaces and Implementations. El software es libre, y el libro vale la pena comprar — que incluye muchos otros módulos que serán muy útiles para cualquiera que escriba las tareas en C.

debo trabajar cada jugador como un 'tenedor' y las roscas el tenedor, o simplemente crear algunos hilos para el jugador y asociarlos de alguna manera?

A menos que le han pedido a utilizar fork, yo evitaría que — los mecanismos de comunicación entre procesos Unix no son tan agradable de usar. Si puede obtener la biblioteca de Hanson, yo diría crear un hilo por jugador y hacer que los jugadores se comuniquen entre sí (y con el servidor del juego, que también debería ser un hilo) utilizando los canales de Hanson.

+0

No se requiere el uso de la horquilla, y dado que la sugerencia general es evitar la comunicación entre los procesos de Unix, buscaré los hilos. Trataré de terminar la tarea lo antes posible y tener tiempo para ver el proceso (solo para saber qué tan desagradables pueden ser). Gracias por la respuesta y la sugerencia del libro. – sergiobuj

1

En una situación por turnos (juego) en realidad no necesita hilos, las fibras/coroutines lo harán (mejor).

'Pagar atención' no requiere un hilo, simplemente acceda al estado (-cambios) cuando esté listo para volver a actuar.