API WindowsNT: Sincronizar hilos

Kartalon

Tengo un programa que crea hilos cada X tiempo (hasta un máximo dado) los cuales recorren posiciones de una "cuadrícula" de forma más o menos aleatoria (representada en forma de una struct con x e y). Mi objetivo es sincronizar los hilos para que no puedan ocupar la misma posición de dicha cuadrícula.

Mi primera idea fue utilizar el paso de mensajes (con recepción bloqueante) con razón del mensaje un entero único para cada casilla. De esta forma, previamente mandamos todos los mensajes para cada casilla y, en el momento de que un hilo avance esa casilla recoge el mensaje y no lo vuelve a enviar hasta que no abandone esa casilla.

(Si un hilo quiere ocupar una casilla que está ocupada tendría que recoger el mensaje y no podría.)

Esto mismo ya lo hice en UNIX (con procesos en vez de hilos) sin problemas.

Sin embargo parece que en Windows sólo se pueden recibir mensajes del mismo hilo (aunque se pueden enviar a cualquier hilo utilizando la ID correspondiente en PostThreadMessage)... Por lo tanto toda la idea anterior al traste.

Al grano:

  • ¿Se pueden recibir mensajes con PeekMessage/GetMessage (u otra) que estén en el "buzón" de otro hilo?

Otra idea que se me ha ocurrido es usar objetos de tipo CRITICAL_SECTION pero claro, necesitaría un objeto por cada "casilla";

  • ¿Es posible crear matrices de objetos CRITICAL_SECTION? ¿Existe algún tipo de inconveniente?
    (Aparte de conseguir pasárselo correctamente a la función del hilo)
JuAn4k4

NINJA edit: Eso de que recorren las casillas aleatoriamente, ¿es necesariamente asi? de ser asi, no vale la respuesta.

Respuesta posiblemente invalida

Tener una matriz de secciones criticas no deberia ser un problema, lo hace oracle para sincronizacion de transacciones cuando dos de ellas acceden al mismo dato. Access sin embargo utiliza una por tabla, con lo que bloquea toda la tabla.
Depende de como de frecuente sea el choque entre varias, te vendra mejor una u otra.

Si puedes, mete en el struct en cada casilla un CRITICAL_SECTION, y te dejas de complicaciones.

r2d2rigo

Yo tambien opino que metas un semaforo/seccion critica en cada casilla y te dejas de lios, asi si otro proceso intenta acceder, lo bloqueas el tiempo que sea y arreglado.

Sr_RoS
Kartalon

Al final pasé una array de semáforos y cero problemas. Los mensajes claramente no se pueden utilizar para sincronizar hilos/procesos en Windows.

Lo intenté también con una array de CRITICAL_SECTION pero no conseguía pasarlo bien (no se porqué y una vez lo hice con semáforos y funcioné dejé de comerme la cabeza xD)

Usuarios habituales

  • Kartalon
  • Sr_RoS
  • r2d2rigo
  • JuAn4k4