[C con Clase] VIDA O MUERTE (concurrencia)

Programante programante en gmail.com
Dom Feb 18 13:45:37 CET 2007


Otro detalle que deberías tener en cuenta es que el compilador podría 
"optimizar" el uso de ciertas variables

         while(clienteactivos >=4)
              {sleep(10000);}

Si el código en ensamblador es
bucle:
    mov eax, clienteactivo
    cmp eax, 4
    jl  salir_bucle
    push 10000
    call sleep
    jmp bucle
salir_bucle:


Podría cambiarlo por:
    mov eax, clienteactivo
bucle:
    cmp eax, 4
    jl  salir_bucle
    push 10000
    call sleep
    jmp bucle
salir_bucle:

basándose en que clienteactivo no cambia de valor dentro del bucle. En 
este caso no podría darlo por supuesto, ya que al llamar a otra función, 
esta podría modificar el contenido de cualquier variable global.

Para evitar esta clase de "sucesos", clienteactivo debería declararse 
como 'volatile'.

Además, ANSI C define el tipo de dato entero *sig_atomic_t*, que 
garantiza que se puede modificar atómicamente, incluso en presencia de 
interrupciones.
No obstante, lo normal es que los tipos de datos hasta enteros, así como 
los punteros  se acceden de forma atómica. "Both of these assumptions 
are true on all of the machines that the GNU C library supports and on 
all POSIX systems we know of." 
(http://www.delorie.com/gnu/docs/glibc/libc_496.html)




Más información sobre la lista de distribución Cconclase