#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_RECURSIVE_MUTEX_INITIALIZER_NP; void recursive_mutex() { /* Mutexes do tipo RECURSIVE permitem que a mesma thread chame o lock mais de uma vez. Quando isto acontece, um contador interno é incrementado, registrando-se a quantidade de locks que a thread chamou. Na chamada do unlock este contador é decrementado até chegar a 0, quando o unlock é efetivamente executado. */ pthread_mutex_lock(&lock); printf("Chamada recursiva ao lock.\n"); pthread_mutex_unlock(&lock); } void* f_thread(void *v) { pthread_mutex_lock(&lock); printf("Lock obtido.\n"); sleep(1); recursive_mutex(); pthread_mutex_unlock(&lock); return NULL; } int main() { pthread_t thr; pthread_create(&thr, NULL, f_thread, NULL); pthread_join(thr, NULL); printf("Finalizando programa.\n"); return 0; }