[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