2012-12-02 61 views
2

我想做一個程序,使用非常低效的算法,使用POSIX線程計算範圍內的完美數字。我似乎無法把握足夠好的概念來讓我的算法正常工作。我想返回一個完美數字的列表。任何人都可以提供一些建議,如何更好地實現這一點?使用pthreads的完美數字計算器

具體問題: - 我如何才能打印出每個完美數字的1個瞬間? - 如何讓它返回值而不是隻打印值?

來源:

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(&mtx); 

    /* Takes in a string and pulls out the two integers */ 
    sscanf(arg,"%i-%i", &start, &end); 
    printf("\nStart: %i\nEnd: %i\n", start, end); 

    printf("\n"); 

    s = pthread_mutex_unlock(&mtx); 

    for (number=start; number<=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<number; i++) {   
      //s = pthread_mutex_lock(&mtx);    
      mod = number % i;   
      //s = pthread_mutex_unlock(&mtx);   

      if (mod == 0){    
       s = pthread_mutex_lock(&mtx);    

       divisor = i; 
       sum = divisor + temp; 
       temp = sum; 

       s = pthread_mutex_unlock(&mtx);      
      }      
     } 
     //if the sum of whole divisors is equal to the number, its perfect 
     if (sum == number) {   

      s = pthread_mutex_lock(&mtx);   

      printf("%i is a Perfect Number \n", sum); 
      //return sum somehow;   

      s = pthread_mutex_unlock(&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 < 5; ++i) { 
     pthread_create(&tid[i], NULL, &threadFunc, input); 
     print_thread_info(); 
    } 
    /* Wait for the perfect number thread to complete, then get result. */ 
    for(i=0; i < 5; ++i) 
     pthread_join(tid[i],NULL); 

    return 0; 
} 

回答

0

訪問可能從另一個線程被修改的數據結構(例如全局變量)或資源(例如,終端)時,你只需要鎖定互斥。

  • 你並不需要鎖定互斥訪問局部變量單個線程
  • 你並不需要鎖定一個互斥體用於讀取永遠不會被另一個線程修改全局變量

因此,在你的情況下,一個互斥體的單用例就是防止多個printf()獲得它們的輸出可能混合起來。

此外,讓所有線程探索相同的範圍是毫無意義的。也許你想要5個線程分別探索不同的範圍(0-1999,2000-2999 ... 8000-9999)?

pthread_join()返回線程(您傳遞的返回值或pthread_exit())的退出值。如果你想返回多個值,你可能想要創建一個全局變量來保存一個數字鏈表(最終需要一個互斥量,因爲不同的線程需要寫入它)