#include <stdio.h>
#include <pthread.h>

pthread_cond_t cond;
pthread_mutex_t mutex;
int werte[10];

/*pthread_cond_t cond = PTHREAD_COND_INITIALIZER;*/

void thread1(void *arg)
{
 int ret,i;
 printf("Thread 1 : %ld gestartet.....\n",pthread_self());
 sleep(1);
 ret=pthread_mutex_lock(&mutex);
 if(ret != 0) { printf("Fehler bei lock in Thread : %ld\n",pthread_self()); exit(0); }

 /*Kritischer Codeabschnitt*/
 for(i=0;i<10;i++)
  werte[i]=i;

 printf("Thread 1 : %ld sendet das Signal für die Condition Variable\n");
 pthread_cond_signal(&cond);
 ret=pthread_mutex_unlock(&mutex);
 if(ret != 0) { printf("Fehler bei unlock in Thread : %ld\n",pthread_self()); exit(0); }
 printf("Thread 1 : %ld beendet\n");

 pthread_exit((void *)0);
}

void thread2(void *arg)
{
 int ret,i;
 int summe=0;
 printf("Thread 2 : %ld wartet auf die Condition Variable\n",pthread_self());
 pthread_cond_wait(&cond, &mutex);
 printf("Thread 2 : %ld gestartet.....\n",pthread_self());

 for(i=0; i<10; i++)
   summe+=werte[i];

 printf("Thread 2 : %ld beendet\n");
 printf("Summe aller Zahlen beträgt : %d\n",summe);

 pthread_exit((void *)0);
}

int main()
{
 pthread_t th[2];

 pthread_cond_init(&cond,NULL);
 pthread_mutex_init(&mutex, NULL);

 pthread_create(&th[0],NULL, (void *)thread1, NULL);
 pthread_create(&th[1],NULL, (void *)thread2, NULL);

 pthread_join(th[0],NULL);
 pthread_join(th[1],NULL);

 return 0;
}