Está en la página 1de 4

Deber Sistemas Operativos

Tema: Analizar la diferencia entre los programas sincro.c y sincro2.c


sincro.c
En el primer archivo si En el cdigo se puede apreciar el uso de una variable
global por 2 hilos de ejecucin, por lo que la variable de ejecucin no es
fcilmente predecible de acertar a su valor final
el primer hilo
void *miFuncion(void *arg) {
int i,j;
for ( i=0; i<20; i++ ) {
j=varGlobal;
j=j+1;
printf("(2)");
fflush(stdout);
sleep(1);
varGlobal=j;
}
return NULL;
}

el segundo hilo
for ( i=0; i<20; i++) {
varGlobal=varGlobal+1;
printf("(1)");
fflush(stdout);
sleep(1);
}

Pero el primero hilo se ejecutar

if ( pthread_create( &miThread, NULL, miFuncion, NULL) ) {


printf("Error al crear el thread.");
abort();
}
Mientras que el segundo espera a que termine el

if ( pthread_join ( miThread, NULL ) ) {


printf("error mientras se esperaba");
abort();
}
Dado que no se ha establecido un orden de ejecucin de los hilos, estn en
un constante cambio de la variable global, varGlobal.

Por lo que en su constante cambio de valor, como se pude ver en el primero


hilo, entra con un valor de 0, pero al segundo hilo llega con un valor de 1.

Pero la ejecucin de los hilos, podra ser aleatoria como se podra apreciar,
produciendo una situacin en que su resultada depende del modo de
intercalado de ejecucin del programa, ms conocida como condicin de
carrera:

En el primer hilo, la variable varGlobal, se iguala a un contador, por lo que el


valor que adquiere en el segundo hilo, se pierde:
j=varGlobal;
j=j+1;

Y como en el segundo hilo se respeta su valor:


varGlobal=varGlobal+1;

La respuesta esperada, dado que inicio con 1 inicialmente es:

Sincro2.c
En el ejemplo sincro2.c inicialmente se puede apreciar el uso de :
pthread_mutex_t miMutex=PTHREAD_MUTEX_INITIALIZER;

Que es una forma de sincronizacin de exclusin mutua


el primer hilo
void *miFuncion(void *arg) {
int i,j;
for ( i=0; i<20; i++ ) {
pthread_mutex_lock(&miMutex);
j=varGlobal;
j=j+1;
printf("(2)");
fflush(stdout);
sleep(1);
varGlobal=j;
pthread_mutex_unlock(&miMutex);
}
return NULL;
}

el segundo hilo

for ( i=0; i<20; i++) {


pthread_mutex_lock(&miMutex);
varGlobal=varGlobal+1;
pthread_mutex_unlock(&miMutex);
printf("(1)");
fflush(stdout);
sleep(1);
}

Pero el primero hilo se ejecutar


if ( pthread_create( &miThread, NULL, miFuncion, NULL) ) {
printf("Eror al crear el thread.");
abort();
}
Mientras que el segundo espera a que termine el

if ( pthread_join ( miThread, NULL ) ) {


printf("Error mientras esperaba.");
abort();
}
Exclusin mutua

Mutex o candado: mecanismo de sincronizacin ms sencillo y eficiente


Sirve para obtener acceso exclusivo a las variables o recursos { En POSIX.1c
son variables de tipo pthread_mutex_t (estructura que almacena todos los
datos concernientes al mutex), siendo una de las soluciones a la condicin
de carrera.
Como se puede apreciar, en mi hilo1, he puesto un candado en mi seccin
critica, restringiendo el ingreso uso o ingreso de mis recursos solamente a
mi funcin en el hilo1, bloqueando y desbloqueando una vez pasada la
seccin critica
pthread_mutex_lock(&miMutex);
j=varGlobal;
j=j+1;
printf("(2)");
fflush(stdout);
sleep(1);
varGlobal=j;
pthread_mutex_unlock(&miMutex);

En mi hilo2, he puesto un candado en mi seccin critica, restringiendo el


ingreso uso o ingreso de mis recursos solamente a mi funcin en el hilo1,
bloqueando y desbloqueando una vez pasada la seccin critica
pthread_mutex_lock(&miMutex);
varGlobal=varGlobal+1;

pthread_mutex_unlock(&miMutex);

Pero con las llamadas de sincronizacin, en nuestro caso de exclusin mutua


(mutex), se ha podido regular la ejecucin pertinente con la variable global,
valGlobal, que ya tiene el resultado normalmente esperado:

Pero aun asi su ejecucin no es secuencial, aveces el hilo1 u aveces el hilo2


como se puede apreciar:

También podría gustarte