2010-05-11 7 views
12

Existe una pregunta existente con respecto a la diferencia entre Mutex y la sección crítica, pero no trata también con bloqueos.Diferencia entre bloqueos, mutex y secciones críticas

Por lo tanto, quiero saber si las secciones críticas se pueden utilizar para la sincronización de subprocesos entre procesos.

también lo que se entiende por los estados señalados y estados no señalado

+2

Son lo mismo para mí, supongo que está utilizando una biblioteca que hace alguna diferencia entre los tres (Win32?). –

+0

¿Está diciendo que Bloqueos como CSingleLock también admite la sincronización de subprocesos cuando se trata de enrutar procesos? Pensé que solo Mutex lo apoya. Por favor corrígeme si estoy equivocado – ckv

Respuesta

7

En Windows, las secciones críticas se implementan (en su mayoría) en el modo de usuario, y un mutex cambiará el contexto al modo kernel (que es lento). Si un hilo termina mientras posee un mutex, se dice que el mutex está abandonado. El estado del mutex está configurado como señalizado, y el siguiente subproceso de espera obtiene propiedad. En la misma situación con una sección crítica, todos los otros hilos permanecerán bloqueados. Las secciones críticas no pueden nombrarse, por lo que no puede usarlas para sincronizar varios procesos.

+0

"secciones críticas se implementan completamente en el modo de usuario" <- No es del todo cierto. Las secciones críticas producirán en lugar de girar si tienen rotación durante el tiempo suficiente. –

2

CriticalSections están en proceso. Los mutexes con nombre se pueden usar en los procesos

El bloqueo es un término general y, como tal, no sabría a qué plataforma se refiere. Por ejemplo, en C#, una primitiva de bloqueo es una Sección crítica.

+0

Y las cerraduras también están en proceso ¿cierto? – ckv

2

1) Sección crítica es el puente entre el usuario y las operaciones de enclavamiento. Utiliza las operaciones intercambiadas sin bloqueo para bloquear y desbloquear hilos. Funciona más rápido que mutexes.

2) Mutex es un objeto kernal. No funciona rápido, pero tiene algunas ventajas. En primer lugar, los mutexes con nombre se pueden usar en todos los procesos. En segundo lugar, si el hilo termina, entonces el mutex bloqueado por este hilo está desbloqueado.

3

Las secciones críticas no son objetos del kernel. No están identificados con ningún mango. Solo se pueden usar para sincronizar los hilos que pertenecen al mismo proceso. No se pueden usar para la sincronización en todo el proceso.

CSingleLock (supongo que usted está refiriendo esto como un bloqueo, en este contexto) es una clase contenedora que usa el concepto RAII. Le ayuda a adquirir el objeto de sincronización de subprocesos (en su constructor) y llama a la API de bloqueo y desbloqueo de una manera fácil. (ocultando todos los detalles internos de los objetos de sincronización que está utilizando).

CSingleLock cuando se utiliza con secciones críticas, no se puede utilizar en el proceso. Donde como Mutex se puede usar para este propósito.

Cuando un hilo adquiere Mutex y ningún otro hilo puede adquirir el Mutex, se dice que el estado del Mutex está en estado No signatario. SI el Mutex está disponible y no se han adquirido hilos, se encuentra en estado Signeled.

Cuestiones relacionadas