REgiones críticas

26/04/2007 - 22:00 por Aurelio | Informe spam
Hola,

A ver si alguien me echar una mano.

Tengo una aplicación que crea un Thread y lo lanza en ejecución a un
determinado método.
El método que ejecuta el Thread, tiene un bucle con bastantes iteraciones
(100.000)
Mi idea es comprobar el funcionamiento de BeginCriticalRegion() y
EndCriticalRegion().

Para ello, encierro el bucle en la región crítica:

void Método(){
BeginCriticalRegion();

for(int i=0;i<1000;i++){
Console.WriteLine(i);
}

EndCriticalRegion();
}

Desde la aplicación principal hago lo siguiente:

...
Thread hilo=new Thread(new StratThread(Metodo));
hilo.Start(100);
Thread.Sleep(); //le doy tiempo al hilo a que entre en el buble
hilo.Abort();
Console.ReadLine(); // detengo el programa principal


Mi idea tal y como entiendo las regiones críticas, es que una vez dentro del
bucle, la llamada Abort no tiene efecto hasta que el hilo salga de el. Sin
embargo, el hilo no llega a completar más que un centenar de iteraciones, de
idéntica forma que sin regiones críticas

Algo estoy haciendo mal o no entendido su funcionamiento.
Muchas gracias antes de nada


Un saludo

Aurelio Martínez Corchano
Grupo LoUISE
Universidad de Castilla - La Mancha
 

Leer las respuestas

#1 Angel J. Hernández M.
26/06/2007 - 18:15 | Informe spam
Hola, qué tal? Una región crítica es un pedazo de código que accede a un
recurso compartido (objeto, variable, dispositivo, etc) que evita que esté
sea accedido de manera concurrente por más de un hilo de ejecución. Por lo
general es necesario utilizar un mecanismo de sincronización de hilos al
entrar y salir de la región crítica, un ejmplo puedes ser un semáforo,
Mutex, etc. En el caso de BeginCriticalSection y EndCriticalSection sirve
para delimitar una sección crítica, si se encuentra una excepción o un hilo
es abortado el host (anfitrión) es notificado sobre esto y el riesgo que
representaría. Cuando la falla ocurre, el anfitrión puede decidir si
descarga el AppDomain en donde sucedió en vez de proseguir con la ejecución,
así evitando que se ponga en riesgo la estabilidad del sistema.

Saludos,


Angel J. Hernández M.
MCP,MCAD,MCSD,MCDBA,MCT
Microsoft MVP
http://msmvps.com/blogs/angelhernandez



"Aurelio" wrote in message
news:%23q$
Hola,

A ver si alguien me echar una mano.

Tengo una aplicación que crea un Thread y lo lanza en ejecución a un
determinado método.
El método que ejecuta el Thread, tiene un bucle con bastantes iteraciones
(100.000)
Mi idea es comprobar el funcionamiento de BeginCriticalRegion() y
EndCriticalRegion().

Para ello, encierro el bucle en la región crítica:

void Método(){
BeginCriticalRegion();

for(int i=0;i<1000;i++){
Console.WriteLine(i);
}

EndCriticalRegion();
}

Desde la aplicación principal hago lo siguiente:

...
Thread hilo=new Thread(new StratThread(Metodo));
hilo.Start(100);
Thread.Sleep(); //le doy tiempo al hilo a que entre en el buble
hilo.Abort();
Console.ReadLine(); // detengo el programa principal


Mi idea tal y como entiendo las regiones críticas, es que una vez dentro
del bucle, la llamada Abort no tiene efecto hasta que el hilo salga de el.
Sin embargo, el hilo no llega a completar más que un centenar de
iteraciones, de idéntica forma que sin regiones críticas

Algo estoy haciendo mal o no entendido su funcionamiento.
Muchas gracias antes de nada


Un saludo

Aurelio Martínez Corchano
Grupo LoUISE
Universidad de Castilla - La Mancha



Preguntas similares