Compartir a través de


Variables de condición

Las variables de condición son primitivos de sincronización que permiten a los subprocesos esperar hasta que se produzca una condición determinada. Las variables de condición son objetos en modo de usuario que no se pueden compartir entre procesos.

Las variables de condición permiten que los subprocesos liberen de forma atómica un bloqueo y entren en estado de suspensión. Se pueden usar con secciones críticas o bloqueos ligeros de lector/escritor (SRW). Las variables de condición admiten operaciones que "reactivan uno" o "reactivan todos" subprocesos en espera. Después de reactivar un subproceso, vuelve a adquirir el bloqueo que liberó cuando el subproceso entró en estado de suspensión.

Tenga en cuenta que el autor de la llamada debe asignar una estructura CONDITION_VARIABLE e inicializarla llamando a InitializeConditionVariable (para inicializar la estructura dinámicamente) o asignar la constante CONDITION_VARIABLE_INIT a la variable de estructura (para inicializar la estructura estáticamente).

Windows Server 2003 y Windows XP: no se admiten variables de condición de.

A continuación se muestran las funciones de la variable de condición.

Función de variable de condición Descripción
initializeConditionVariable Inicializa una variable de condición.
SleepConditionVariableCS Se suspende en la variable de condición especificada y libera la sección crítica especificada como una operación atómica.
sleepConditionVariableSRW Se suspende en la variable de condición especificada y libera el bloqueo SRW especificado como una operación atómica.
WakeAllConditionVariable Activa todos los subprocesos en espera de la variable de condición especificada.
WakeConditionVariable Activa un único subproceso en espera de la variable de condición especificada.

 

El pseudocódigo siguiente muestra el patrón de uso típico de las variables de condición.

CRITICAL_SECTION CritSection;
CONDITION_VARIABLE ConditionVar;

void PerformOperationOnSharedData()
{ 
   EnterCriticalSection(&CritSection);

   // Wait until the predicate is TRUE

   while( TestPredicate() == FALSE )
   {
      SleepConditionVariableCS(&ConditionVar, &CritSection, INFINITE);
   }

   // The data can be changed safely because we own the critical 
   // section and the predicate is TRUE

   ChangeSharedData();

   LeaveCriticalSection(&CritSection);

   // If necessary, signal the condition variable by calling
   // WakeConditionVariable or WakeAllConditionVariable so other
   // threads can wake
}

Por ejemplo, en una implementación de un bloqueo lector/escritor, la función TestPredicate comprobaría que la solicitud de bloqueo actual es compatible con los propietarios existentes. Si es así, adquiera el bloqueo; de lo contrario, duerme. Para obtener un ejemplo más detallado, vea Using Condition Variables.

Las variables de condición están sujetas a reactivaciones falsas (las que no están asociadas a una reactivación explícita) y las reactivaciones robadas (otro subproceso administra la ejecución antes del subproceso despertado). Por lo tanto, debe volver a comprobar un predicado (normalmente en un mientras bucle) después de que se devuelva una operación de suspensión.

Puede reactivar otros subprocesos mediante WakeConditionVariable o WakeAllConditionVariable dentro o fuera del bloqueo asociado a la variable de condición. Normalmente es mejor liberar el bloqueo antes de despertar otros subprocesos para reducir el número de modificadores de contexto.

A menudo es conveniente usar más de una variable de condición con el mismo bloqueo. Por ejemplo, una implementación de un bloqueo lector/escritor podría usar una sola sección crítica, pero separar variables de condición para lectores y escritores.

usar variables de condición