2011-10-07 20 views
21

Estoy buscando algunos problemas de concurrencia simples y canónicos, adecuados para demostrar el uso de una biblioteca para cálculos concurrentes en los que estoy trabajando.¿Cuál es el "Hola mundo" de los programas concurrentes?

Para aclarar lo que quiero decir con "concurrencia": me interesan los algoritmos que utilizan procesos de comunicación no deterministas, no en p. Ej. haciendo que los algoritmos como el quicksort corran más rápido distribuyendo el trabajo en múltiples procesadores. This es como estoy usando el término.

Conozco el Dining Philosophers Problem, y eso sería aceptable, pero me pregunto si hay otros problemas más convincentes pero igualmente simples.

Respuesta

6

Generalmente uso un escenario simple de "transferencia de cuenta bancaria". Por ejemplo, publiqué un caso tan trivial en this question on transactions.

Es un buen caso para la exposición porque:

  • Todo el mundo entiende el problema de negocio.
  • Destaca las importancias de las transacciones en un entorno concurrente.
  • Puede extender fácilmente el escenario (por ejemplo, ¿qué pasaría si se desea calcular la suma de todos los saldos de cuenta corriente mientras que las transacciones se llevan a cabo?)

Para demostrar su biblioteca de concurrencia, que probablemente se podría iniciar una ejecución hilo millones de transacciones en este tipo de escenario y demostrar cómo otros subprocesos aún pueden ver una vista coherente del mundo, etc.

+0

¡Gracias! Aunque está un poco seco, creo que esta es la mejor de las respuestas hasta ahora. – jberryman

3

No creo que haya un primer programa estándar para demostrar que la concurrencia funciona, como "Hola mundo" para programas secuenciales.

Más típicos de la concurrencia son los programas que muestran problemas, por ejemplo, los contadores simultáneos que pierden algunos conteos sin una sincronización adecuada. O transferencias aleatorias entre cuentas bancarias que causan un punto muerto si el bloqueo se realiza ingenuamente. (Lo hice cuando jugué con simultaneidad Java.)

Una cosa que demuestra la concurrencia y es relativamente simple es contar cooperativamente: los hilos simultáneos (o lo que sea) tienen un contador interno, que se envían entre sí, y establecer a lo que reciben más uno. (Lo hice con tres LEGO Mindstorms RCX sobre infrarrojos hace algunos años, funcionó bien.)

BTW: El "Hola mundo" del programador incorporado es el LED parpadeante.

+2

Especialmente si haces que parpadee "HELLO WORLD" en Morse. –

1

Puede rayar "Hola" y "Mundo" en hilos separados. O anima "Hola" mientras "Mundo" está trazando rayos.

3

Solía ​​haber un ejemplo de applet de Java (posiblemente aún lo es) que usaba para probar qué programación algoritmo de su JVM y el uso del sistema operativo subyacente. Animó dos barras (u opcionalmente más? No puede recordar) llenándose gradualmente, cada una animada por un hilo diferente con la misma prioridad.

Un equivalente que imprime:

red 1 
red 2 
green 1 
red 3 
green 2 

etc a la consola, me parece que sea lo más cercano en espíritu a la naturaleza del esqueleto "hola, mundo". Es decir, "¿puedo hacer que la computadora haga algo inútil pero visible?"

Por lo tanto, en cada hilo querría una serie de pausas (ya sean bucles ocupados o durmientes, dependiendo de usted, y que elija podrían afectar la salida dependiendo de cómo esté programada su concurrencia), cada una seguida de alguna salida. Es posible que desee sincronizar la salida, no es realmente esencial, pero si el planificador rompiera una línea, sería incómodo de leer.

Luego, si su modelo de simultaneidad es cooperativo (ya sea hilos neolíticos, o tal vez algo basado en rutinas), también debe agregar rendimientos adecuados para evitar que la barra roja se llene antes de que comience la barra verde. Eso te dice que has logrado que tu código simultáneo se intercala.

Cuestiones relacionadas