Espera activa

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

En Informática, se denomina espera activa a una técnica donde un proceso repetidamente verifica una condición, tal como esperar una entrada de teclado o si el ingreso a una sección crítica está habilitado. Puede ser una estrategia válida en algunas circunstancias especiales, sobre todo en la sincronización de procesos en los sistemas con múltiples procesadores (SMP). En general, debe ser evitada, ya que consume tiempo de CPU sin realizar ninguna operación.

Ejemplo en ensamblador[editar]

Este código realiza la comprobación del estado de la pantalla, que se encuentra en la parte de memoria 508, cuando está disponible, es decir, cuando 508=1, continúa con la inserción de datos usando 509.

[d]   LD  /508
[d+1] BZ  /d
[d+2] LD  /dato
[d+3] ST  /509

Ejemplo en Código C[editar]

Este código muestra dos threads (hilos) que comparten la variable global entera i. El primer thread usa espera activa para chequear un cambio en el valor de i.

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

volatile int i; /* i es global, por lo que es visible para todas las funciones.
                   También está marcada como volatile, porque cambiará
                   de forma que no es predecible por el compilador
                   (en este caso: por un hilo diferente.) */

/* t1 usa un spinlock para esperar hasta que i deje de valer 0 */
static void *f1()
{
    while (i==0)
    {
        /* no hacer nada - sólo seguir comprobando una y otra vez */
    } 
    printf("i's value has changed to %d.\n", i);
  
    return;
}

static void *f2()
{
    sleep(60); /* dormir 60 segundos. */
    i = 99;
    printf("t2 changing the value of i to %d.\n", i);

    return;
}

int main()
{
    int x;
    pthread_t t1, t2;
    i = 0; /* set global int i to 0. */
 
    x = pthread_create(&t1, NULL, f1, NULL);
    if (x != 0)
    {
        printf("pthread foo failed.\n");
    }
 
    x = pthread_create(&t2, NULL, f2, NULL);
    if (x != 0)
    {
        printf("pthread bar failed.\n");
    }
 
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("all pthreads finished.\n");
    return 0;
}

En un sistema UNIX, puede compilar este código con este comando:

$ cc spinlock.c -lpthread

En Linux, reemplace el compilador cc con el compilador gcc.