/* * Cuando dos hebras acceden a un mismo dato y una de ellas lo modifica, otras * podrían leer un valor inconsistente si no usamos mecanismos de exclusión mutua. * Se desea medir el tiempo que toma en aparecer esa inconsistencia. * Para ello se le pide hacer un programa que genere usar dos hebras. * En una usted intercambiará el valor de una variable entre "1111111" y "2222222000". * La otra hebra leerá el valor de la variable, * si éste es distinto de los dos valores indicados, enviará una alerta a pantalla * y terminará la aplicación. Como este proceso podría tomar * mucho tiempo, se le pide definir un tiempo máximo de ejecución en segundos * ingresado como argumento en la línea de ejecución del programa. * Transcurrido este tiempo el programa avisa que no encontró inconsistencias y termina. * Segunda parte: Ponga mecanismos de exclusión para evitar la aparición * de la inconsistencia. (indique el código y dónde lo insertaría, para * no escribir todo su programa nuevamente). * * */ #include #include #include #include #include #include #define value1 "1111111" #define value2 "2222000000" int exclusion=1; char value[11]; static void sig_alrm(int signo) { printf("I can't find an inconsistancy\n"); exit(0); } pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; void * changeValue(void * arg) { while (1) { if (exclusion) pthread_mutex_lock(&mylock); if (strcmp(value, value1)==0) strcpy(value, value2); else strcpy(value, value1); if (exclusion) pthread_mutex_unlock(&mylock); } } int main(int argc, char * argv[]) { int err; pthread_t tid; char readValue[11]; int timeout; int* pStatus; timeout = atoi(argv[1]); if (signal(SIGALRM, sig_alrm) == SIG_ERR) exit(-1); strcpy(value, value1); err = pthread_create(&tid, NULL, changeValue, NULL); if (err != 0){ printf("can't create thread \n"); exit(0); } alarm(timeout); /* start the timer */ while (1){ if (exclusion) pthread_mutex_lock(&mylock); strcpy(readValue, value); if (exclusion) pthread_mutex_unlock(&mylock); if ((strcmp(readValue,value1)!=0) && (strcmp(readValue,value2)!=0)){ printf("Inconsistency, the string content is %s\n",readValue); exit(0); } } }