En muchas situaciones es conveniente controlar el acceso de varios procesos a una región crítica por una condición. Con las regiones críticas simples no se puede realizar tal control. Hace falta otra construccion, por ejemplo:
V is shared variable
C is boolean expression
region V when C do
code of critical region
En la programación orientada a objectos las regiones críticas condicionales donde la condición refleja el estado actual de un objeto son muy útiles para controlar el acceso al objeto dependiendo de este estado (en Java se puede implementar p.ej. con una construcción de bucle con try).
Las regiones críticas condicionales funcionan internamente de la siguiente manera:
Se implementa una región crítica normalmente con dos colas diferentes. Una cola principal controla los procesos que quieren acceder a la región crítica, una cola de eventos controla los procesos que ya han obtenido una vez el cerrojo pero que han encontrado la condición en estado falso. Si un proceso sale de la región crítica todos los procesos que quedan en la cola de eventos pasan de nuevo a la cola principal porque tienen que recomprobar la condición.
Nota que esta técnica puede derivar en muchas comprobaciones de la condición, todos en modo exclusivo, y puede causar perdidas de eficiencia. En ciertas circunstancias hace falta un control más sofisticado del acceso a la región crítica dando paso directo de un proceso a otro.