#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h> 

/*
  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_thread(void *v) {

  /*
    Mutexes do tipo ERRORCHECK verificam no momento do unlock se
    o mutex está efetivamente lockado.

    Caso isto não seja verdade, 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 não locado\n");
  }

  return NULL;
}

int main() {
  pthread_t thr;
  pthread_create(&thr, NULL, f_thread, NULL);
  pthread_join(thr, NULL);

  printf("Finalizando programa\n");

  return 0;
}