title: compute pi value using monte carlo method multithreading
body: <p>I am trying to find value of PI using montecarlo method, and using parallel C code. i have write serail code and works fine. But the parallel code gives me wrong values of pi some times 0 or minus values </p>
  
  <p>my code </p>
  
  <pre><code> #include &lt;pthread.h&gt;
   #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;math.h&gt;
   #define NUM_THREADS 4 //number of threads
  #define TOT_COUNT 10000055 //total number of iterations
  
  
  
  void *doCalcs(void *threadid)
  {
  long longTid;
  longTid = (long)threadid;
  int tid = (int)longTid; //obtain the integer value of thread id
  //using malloc for the return variable in order make
  //sure that it is not destroyed once the thread call is finished
  float *in_count = (float *)malloc(sizeof(float));
  *in_count=0;
  unsigned int rand_state = rand();
  //get the total number of iterations for a thread
  float tot_iterations= TOT_COUNT/NUM_THREADS;
  int counter=0;
  //calculation
  for(counter=0;counter&lt;tot_iterations;counter++){
      //float x = (double)random()/RAND_MAX;
      //float y = (double)random()/RAND_MAX;
      //float result = sqrt((x*x) + (y*y));
      double x = rand_r(&amp;rand_state) / ((double)RAND_MAX + 1) * 2.0 - 1.0;
      double y = rand_r(&amp;rand_state) / ((double)RAND_MAX + 1) * 2.0 - 1.0;
      float result = sqrt((x*x) + (y*y));
      if(result&lt;1){
          *in_count+=1; //check if the generated value is inside a unit circle
      }
  }
  //get the remaining iterations calculated by thread 0
   if(tid==0){
        float remainder = TOT_COUNT%NUM_THREADS;
        for(counter=0;counter&lt;remainder;counter++){
              float x = (double)random()/RAND_MAX;
           float y = (double)random()/RAND_MAX;
            float result = sqrt((x*x) + (y*y));
          if(result&lt;1){
              *in_count+=1; //check if the generated value is inside a unit circle
          }
      }
  }
   }
  
  
   int main(int argc, char *argv[])
    {
      pthread_t threads[NUM_THREADS];
     int rc;
     long t;
     void *status;
      float tot_in=0;
       for(t=0;t&lt;NUM_THREADS;t++){
        rc = pthread_create(&amp;threads[t], NULL, doCalcs, (void *)t);
        if (rc){
      printf("ERROR; return code from pthread_create() is %d\n", rc);
      exit(-1);
       }
  }
  //join the threads
  for(t=0;t&lt;NUM_THREADS;t++){
  pthread_join(threads[t], &amp;status);
  //printf("Return from thread %ld is : %f\n",t, *(float*)status);
  tot_in+=*(float*)status; //keep track of the total in count
  }
  printf("Value for PI is %f \n",1, 4*(tot_in/TOT_COUNT));
  /* Last thing that main() should do */
  pthread_exit(NULL);
    }               
  </code></pre>