Una llamada sin bloqueo a una parte del código generalmente implica la solicitud de un recurso, como una impresora o un evento en su caso.
Si la impresora está ocupada, o el evento no ha ocurrido, hay dos posibilidades:
- esperar a que el recurso esté disponible
- continuar y comprobar después de un tiempo
la primera opción está bloqueando: la ejecución del código se detuvo en lo que se llama ocupado esperando , o spooling. El procesador no puede hacer nada y eso es un desperdicio de energía y tiempo.
la segunda forma es no bloquear: las ejecuciones de código continúan, el procesador puede hacer otra cosa, posiblemente atendiendo otros eventos y luego volver a verificar. El problema es que si su evento caduca de alguna manera, la ejecución del código puede no volver a tiempo.
Algunos pseudo c para ilustrar un ejemplo de espera ocupada:
while(event_1_has_happened == 0); //do nothing
int result_1 = service_event_1();
while(event_2_has_happened == 0); //do nothing
int result_2 = service_event_2();
//... and so on
Sin bloqueo de espera:
int keep_servicing = 1;
while(keep_servicing == 1) {
if(event_1_has_happened == 1) {
int result_1 = service_event_1();
}
if(event_2_has_happened == 1) {
int result_2 = service_event_2();
}
//... and so on
keep_servicing = somefunctionofresults(result_1, result2, ..);
}
Tenga en cuenta: los ejemplos anteriores asumen que las funciones event_n_has_happened devuelven inmediatamente si el evento ha ocurrido o no. Pueden ser algo así como verificar si un pin de entrada es alto o bajo, o lo que sea.