#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* f_thread(void *v) { /* Mutexes recursivos possui um contador interno utilizado para manter o número de chamadas à pthread_mutex_lock executadas por uma thread. Este contador é armazenado em um long. Caso este contador sofra um overflow, o erro EAGAIN é retornado. Este loop abaixo chama o lock até que este erro aconteça e imprime a quantidade de chamadas executadas. O uso de long long não é compatível com ISO C90, mas é necessário para que possamos contar o número de chamadas sem que i também sofra um overflow. */ long long int i; for (i = 0;;i++) { if (pthread_mutex_lock(&lock) == EAGAIN) { printf("Overflow do contador do mutex recursivo.\n"); printf("i = %lld.\n\n", i); break; } } return NULL; } int main() { pthread_t thr; pthread_create(&thr, NULL, f_thread, NULL); pthread_join(thr, NULL); printf("Finalizando programa.\n"); return 0; }