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.