/* * Código incompleto */ #include #include #include #include pthread_mutex_t lock; pthread_barrier_t barrier; /* Thread que segura o lock tem a menor prioridade */ void* f_thread0(void *v) { int i; pthread_barrier_wait(&barrier); pthread_mutex_lock(&lock); sleep(10); for (i = 0; i < 1000; i++) int k = i*i*i; pthread_mutex_unlock(&lock); return NULL; } /* Thread de maior prioridade aguarda o lock */ void* f_thread1(void *v) { pthread_barrier_wait(&barrier); pthread_mutex_lock(&lock); printf("Thread 1.\n"); pthread_mutex_lock(&lock); return NULL; } /* Outra thread com prioridade alta quer o processador só para ela. */ void* f_thread2(void *v) { pthread_barrier_wait(&barrier); while(1); return NULL; } int main() { pthread_t thr0, thr1, thr2; pthread_barrier_init(&barrier, NULL, 3); pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_PRIO_INHERIT_NP); pthread_mutex_init(&lock, NULL); pthread_create(&thr0, NULL, f_thread0, NULL); pthread_create(&thr1, NULL, f_thread1, NULL); pthread_create(&thr2, NULL, f_thread2, NULL); pthread_join(thr0, NULL); pthread_join(thr1, NULL); pthread_join(thr2, NULL); return 0; }