#include <stdio.h>
#include <pthread.h>
#include <asm/errno.h>

pthread_mutex_t MUTEX;
pthread_mutexattr_t attribut;

void rechne(void)
{
  int i;
  for(i=0;i<4; i++)
    {
      if(pthread_mutex_trylock(&MUTEX) == 0)
        {
          printf("Funktion \"hallo1()\" aufgerufen\n");
          if( (pthread_mutex_unlock(&MUTEX)) !=0)
            {
              fprintf(stderr,"Konnte Sperre nicht mehr aufheben....\n");
              exit(0);
            }
        }
      else if(i==1)
        pthread_mutex_unlock(&MUTEX);
      else
        printf("Funktion noch nicht berreit.....\n");
    }
}


int main()
{
   pthread_t t1;

   if(pthread_mutexattr_init(&attribut) != 0)
    {
      fprintf(stderr, "Kein Mutexerstellung möglich.........\n");
      exit(0);
     }

  if(pthread_mutexattr_setkind_np(&attribut, PTHREAD_MUTEX_RECURSIVE_NP) !=0)
     fprintf(stderr, "Konnte Attribut PTHREAD_MUTEX_RECURSIVE_NP nicht setzen\n");

  if((pthread_mutex_init(&MUTEX, &attribut)) !=0)
    {
      fprintf(stderr, "Fehler bei pthread_mutex_init.......\n");
      exit(0);
    }
  pthread_mutex_lock(&MUTEX);
  if((pthread_create(&t1, NULL, (void *)&rechne, NULL)) !=0)
    {
     fprintf(stderr, "Fehler bei ptread_create.........\n");
     exit(0);
    }

  pthread_join(t1, NULL);
  pthread_mutex_destroy(&MUTEX);
  pthread_mutexattr_destroy(&attribut);
  
  return 0;
}