title: Perfect number calculator using pthreads
body: <p>I am trying to make a program that uses a very inefficient algorithm that computes perfect numbers within a range using POSIX threads. I can't seem to grasp the concept of locking well enough to get my algorithm to work correctly. I want to return a list of perfect numbers. Can anyone offer some advice on how to implement this better?</p>
  
  <p>Specific Questions:
   - How do I make it print out only 1 instant of each perfect number?
   - How do I make it return the value instead of just print the values?</p>
  
  <p>Source:</p>
  
  <pre><code>static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
  
  static void * threadFunc(void *arg) {
  
      int range, start, end;
      int i, s,  number, mod, divisor, temp, sum;
  
      s = pthread_mutex_lock(&amp;mtx);   
  
      /* Takes in a string and pulls out the two integers */
      sscanf(arg,"%i-%i", &amp;start, &amp;end);
      printf("\nStart: %i\nEnd: %i\n", start, end);
  
      printf("\n");
  
      s = pthread_mutex_unlock(&amp;mtx);
  
      for (number=start; number&lt;=end; number++) { // loop through range of numbers                
  
          temp=0,sum=0;           
          // loops through divisors of a number and sums up whole divisors
          for (i=1; i&lt;number; i++) {          
              //s = pthread_mutex_lock(&amp;mtx);             
              mod = number % i;           
              //s = pthread_mutex_unlock(&amp;mtx);           
  
              if (mod == 0){              
                  s = pthread_mutex_lock(&amp;mtx);               
  
                  divisor = i; 
                  sum = divisor + temp;
                  temp = sum;
  
                  s = pthread_mutex_unlock(&amp;mtx);                     
              }                       
          }
          //if the sum of whole divisors is equal to the number, its perfect
          if (sum == number)  {           
  
              s = pthread_mutex_lock(&amp;mtx);           
  
              printf("%i is a Perfect Number \n", sum);
              //return sum somehow;           
  
              s = pthread_mutex_unlock(&amp;mtx);         
          }
      }
  
      return NULL;
  }
  
  
  int main(int argc, char *argv[]) {
      pthread_t tid[5];
  
      int prefect_number, i, s;
  
      char input[]="1-9999";
  
      for(i=0; i &lt; 5; ++i) {
          pthread_create(&amp;tid[i], NULL, &amp;threadFunc, input);
          print_thread_info();
      }
      /* Wait for the perfect number thread to complete, then get result. */  
      for(i=0; i &lt; 5; ++i)
          pthread_join(tid[i],NULL);
  
      return 0;   
  }
  </code></pre>