#include #include #include #include /* Inicializacao estatica. NP significa Non-portable Para usar este inicializador, devemos compilar o programa informando a flag -D_GNU_SOURCE */ pthread_mutex_t lock = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; void* f_thread1(void *v) { pthread_mutex_lock(&lock); /* Dorme para que a thread2 execute o unlock antes da thread1 e assim possamos ilustrar a situação de erro. */ sleep(2); if (pthread_mutex_unlock(&lock) == EPERM) { printf("Erro não esperado.\n"); } else { printf("Unlock efetuado com sucesso.\n"); } return NULL; } void* f_thread2(void *v) { /* Faz com que a thread2 execute o unlock depois do lock efetuado pela thread1. */ sleep(1); /* Mutexes do tipo ERRORCHECK verificam no momento do unlock se a thread que está executando o unlock é a mesma que executou o lock. Caso isto aconteça, a função pthread_mutex_lock retorna imediatamente EPERM, sinalizando o erro para quem a chamou. */ if (pthread_mutex_unlock(&lock) == EPERM) { printf("Unlock de mutex que foi lockado por outra thread.\n"); } return NULL; } int main() { pthread_t thr1, thr2; pthread_create(&thr1, NULL, f_thread1, NULL); pthread_create(&thr2, NULL, f_thread2, NULL); pthread_join(thr1, NULL); pthread_join(thr2, NULL); printf("Finalizando programa\n"); return 0; }