/* * 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á entre 1111111 y 2.222.222.000 el valor de una variable * entera larga (long). 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 #define value1 1111111LL #define value2 2222222000LL int exclusion=0; long long int value=value1; 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 (value==value1) value = value2; else value = value1; if (exclusion) pthread_mutex_unlock(&mylock); } } int main(int argc, char * argv[]) { int err; pthread_t tid; long long int readValue; int timeout; int* pStatus; timeout = atoi(argv[1]); if (signal(SIGALRM, sig_alrm) == SIG_ERR) exit(-1); 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); readValue=value; if (exclusion) pthread_mutex_unlock(&mylock); if ((readValue!=value1) && (readValue!=value2)){ printf("Inconsistency, the integer value is %lld\n",readValue); exit(0); } } }