2011-04-09 23 views
7

Solo quiero un poco de claridad sobre esto. Imagine que uso la API de Windows de EnterCriticalSection. Llamo todos ellos con EnterCriticalSection(&criticalsection);¿Qué es exactamente una sección crítica?

Esta es la función de hilo que es multi roscado

void thread(){ 

//enter critical section (part 1) 
data 
//leave critical section 
///more data 1 
//entercritical section (part 2) 
//more data 2 
//leave critical section 

} 

Una vez que un hilo entra en la crítica (parte 1), otros hilos no puede entrar en esa sección independientemente de si más datos 1 en realidad tiene datos compartidos o no ¿verdad? También durante ese tiempo, otros hilos tampoco pueden ingresar a la parte 2 de la sección crítica.

+0

Hans - no es cierto. Jake preguntó si un proceso en CriticalSection1 bloquearía CS1 y CS2. Esto es falso: las secciones críticas son independientes. Jake, si quieres CS1 para bloquear ambos, anidarás CS2 dentro de CS1. – Greg

Respuesta

8

La sección crítica es un fragmento de código. Si algún hilo lo ingresó, ningún otro hilo puede ingresar hasta que sea gratis. Si 1 y 2 son secciones críticas diferentes (es decir, manejadas por un semáforo diferente), alguien puede ingresar 2 si 1 está ocupado.

3

La regla es simple: solo un hilo puede ejecutar código dentro de una sección crítica particular (cualquier porción de código ejecutado entre llamadas a EnterCriticalSection y LeaveCriticalSection en la misma instancia). Desde el punto de vista del sistema operativo, cosas como porciones de código, las funciones son irrelevantes aquí. Lo único que importa es la cantidad de llamadas a las rutinas mencionadas. Cada vez que ocurre una situación, un hilo llamado EnterCriticalSection más veces que LeaveCriticalSection en un objeto de sección crítica en particular, se dice que está "dentro de esa sección crítica".

Dicho esto, puede crear múltiples secciones críticas y se aplican de forma independiente. Entonces, una sección crítica nunca afecta otra sección crítica. Se crean diferentes secciones críticas usando llamadas separadas al constructor.

2

ver esto:

Considere una variable

int k 

dos hilos están operando en k con esta declaración

k+=100; 

Supongamos ahora k es igual a 0. El primer hilo empieza a leer k, encuentre k = 0, luego agregue k por 100. Luego, el segundo hilo comienza a leer k antes de que el primer hilo escriba k = 100 hacia atrás. Entonces, el segundo hilo asumirá k = 0 y lo sumará a 100 y, finalmente, después de dos hilos se unirá a k = 100 no se espera 200. Esta es la razón por la que establecemos k+=100 en una sección crítica.