#include<stdio.h>
#include<pthread.h>
#define array_size 1000
#define no_threads 10
/* shared data*/
int a[array_size];		/* array of numbers to sum*/
int global_index=0;             /*global index*/
int sum=0;                      /*final results, also used by slaves*/
pthread_mutex_t mutex1;         /*mutually exclusive lock variable*/
void *slave(void *ignored)      /*slave threads*/
{
  int local_index, partial_sum=0;
  do {
    pthread_mutex_lock(&mutex1);/* get next index into the array*/
    local_index=global_index;   /*read current index & save locally*/
    global_index++;             /*increment global index*/
    pthread_mutex_unlock(&mutex1);
    if(local_index < array_size) partial_sum+=*(a+local_index);
    printf("Thread id:%d -->partial sum:%d\n", pthread_self(),partial_sum);
  } while(local_index< array_size);
  pthread_mutex_lock(&mutex1);  /*add partial sum to global sum*/
  sum+=partial_sum;
  pthread_mutex_unlock(&mutex1);
  return ;                      /*thread exits*/
}

main()
{
  int i;
  pthread_t thread[10];             /*threads*/
  pthread_mutex_init(&mutex1,NULL); /*initialize mutex*/

  for (i=0; i< array_size;i++)      /*initialize a[]*/
    a[i]=i+1;
  for(i=0;i<no_threads;i++)         /*create threads*/
    if(pthread_create(&thread[i],NULL,slave,NULL)!=0) perror("Pthread_create fails");
  for(i=0;i<no_threads;i++)         /*join threads*/
    if(pthread_join(thread[i],NULL)!=0) perror("Pthread_join fails");
  printf("The sum of 1 to %i is %d \n",array_size,sum);
}
