6

Podemos usar la nueva variable de condición variable o el evento de Windows para sincronizar los hilos en WinNT v6.xo posterior. Considere los siguientes dos enfoques, queremos que los trabajadores se ejecuten al mismo tiempo cuando "go" se establece en main, de lo contrario, todos deben bloquearse.Variable de condición de Windows vs. Evento

/*language C code*/ 
/*Windows Condition Variable*/ 
int go=0; 
CONDITION_VARIABLE cv; 
SRWLOCK lock; 
void workers() 
{ 
    AcquireSRWLockShared(&lock); 
    if(go==0) 
    { 
     SleepConditionVariableSRW(&cv, &lock, INFINITE, CONDITION_VARIABLE_LOCKMODE_SHARED); 
    } 
    ReleaseSRWLockShared(&lock); 
    /* 
    Workers continue... 
    */ 
} 
void main() 
{ 
    int i; 
    InitializeConditionVariable(&cv); 
    InitializeSRWLock(&lock); 
    for(i=0;i<10;i++) 
    { 
     CreateThread(0, 0, workers, 0, 0, 0); 
    } 
    AcquireSRWLockExclusive(&lock); 
    go=1; 
    ReleaseSRWLockExclusive(&lock); 
    WakeAllConditionVariable(&cv); 
} 

o

/*language C code*/ 
/*Windows Event*/ 
HANDLE go; 
void workers() 
{ 
    WaitForSingleObject(go, INFINITE); 
    /* 
    Workers continue... 
    */ 
} 
void main() 
{ 
    int i; 
    go=CreateEvent(0,1,0,0); /*No security descriptor, Manual Reset, initially 0, no name*/ 
    for(i=0;i<10;i++) 
    { 
     CreateThread(0, 0, workers, 0, 0, 0); 
    } 
    SetEvent(go); 
} 

En el primer enfoque, los trabajadores están bloqueados en SleepConditionVariableSRW y se despertó por WakeAllConditionVariable. En el segundo, están bloqueados en WaitForSingleObject y se despertaron por SetEvent.

¿Cuál es mejor en la práctica, solo con respecto a la sobrecarga? (Pista: cambio de contexto, bloqueo de contención, por encima de los hilos de bloqueo)

yo elegiría la primera, pero sentir la falta de justificación.

Respuesta

5

Este caso de uso particular es ideal para un evento: es un proceso de una sola vez, donde todos los hilos de espera deben ser despertados.

Las variables de condición son más adecuadas para cosas como colas, donde hay un predicado asociado que puede o no ser cierto cuando se despierta el hilo de espera (como elementos en la cola --- pueden haber sido consumidos por otro hilo), o cuando sea importante, el hilo despertado es uno de los que ya están esperando cuando se notifica la variable de condición, en lugar de uno que aparece después.

Además, como señaló Hans, las variables de estado nativas de Windows solo funcionan en Vista o posterior, por lo que no puede usarlas si la compatibilidad con Windows XP es una preocupación.

2

El soporte para las variables de condición requiere Vista o superior. Por lo general, donde se detiene el dinero, apoyar XP lamentablemente sigue siendo importante. Su segundo fragmento también tiene la considerable ventaja de que es trivial de entender. No tengo ni idea de lo que estás tratando de hacer en el primero, parece estar mal.

Cuestiones relacionadas