Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/09/2007, 02:36
Avatar de Eternal Idol
Eternal Idol
 
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 7 meses
Puntos: 74
Re: Concurrencia con pthreads

Es necesario, no tiene importancia que la variable sea de un solo byte. Un caso simple:

int x = globBool++;

HILO A: mov eax, byte ptr [globBool] ;eax=2
HILO A: inc eax ;eax=3
HILO B: mov eax, byte ptr [globBool] ;eax=2
HILO B: inc eax ;eax=3
HILO B: mov byte ptr [globBool], eax ;eax=3
HILO A: mov byte ptr [globBool], eax ;eax=3


Si el valor inicial era 2, tenemos que el valor final de globBool es 3 cuando en realidad deberia ser 4 cuando dos hilos intentaron incrementarlo.

Con un mutex lo que pasaria es esto:

HILO A: grabMutex
HILO A: mov eax, byte ptr [globBool] ;eax=2
HILO A: inc eax ;eax=3
HILO B: waitForMutex
HILO A: mov byte ptr [globBool], eax ;eax=3
HILO A: releaseMutex
HILO B: grabMutex
HILO B: mov eax, byte ptr [globBool] ;eax=3
HILO B: inc eax ;eax=4
HILO B: mov byte ptr [globBool], eax ;eax=4
HILO B: releaseMutex


Con lo cual globBool tendria el valor correcto.

Otra cosa seria que tuvieras funciones atomicas disponibles, yo trabajo en Windows y las hay (InterlockedIncrement por ejemplo).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO