2016-03-04 29 views
-1

我想要更改此程序,以便如果用戶輸入數字N,它將使素數達到N值。因爲我是新手,我無法想象它。請向我解釋我錯過了什麼。 MAX_PRIME是我的輸入參數,候選人是我想要計算的素數。使用pthread進行主數量計算但得到錯誤結果

#include <pthread.h> 
#include <stdio.h> 
#include<stdlib.h> 
#include<math.h> 



int NUM_THREADS; 
pthread_t *thread; 
int MAX_PRIME; 
int current = 1; 
int candidate; 

pthread_mutex_t thread_flag_mutex; 

int get_next_candidate() 
{ 
    pthread_mutex_lock (&thread_flag_mutex); 
    int result=current++; 
    pthread_mutex_unlock (&thread_flag_mutex); 

    return result; 
} 


int compute_prime(int numPrime) 
{ 
    int candidate = 2; 
    while (1) 
    { 
     int factor; 
     int is_prime = 1; 

     /* Test primality by successive division. */ 
     for (factor = 2; factor < MAX_PRIME; ++factor) 
     { 
      if (candidate % factor == 0) 
      { 
       is_prime = 0; 
       break; 
      } 
     } 

     if (is_prime) 
     { 
      if (--numPrime == 0) 
      { 
       return candidate; 
      } 
     }  
     ++candidate; 
    } 

    return 0; 
} 


void* prime_job(void* t) 
{ 

    long tid = (long) t , total = 0 , result=0; 


    printf("Thread %ld starting...\n", tid); 

    while((candidate=get_next_candidate())<=MAX_PRIME){ 
     result=compute_prime(candidate);  
     printf("Thread %ld found prime: %ld\n",tid, result); 

     ++total; 
    } 

    pthread_exit((void*) total); 
} 


//******************************* main 
int main (int argc, char **argv) 
{ 
    if (argc<=1){ 
     printf("usag : prime MaxNumber [NUM_THREADS]"); 
     return 0; 
    } 

    else if (argc==2){ 
     //setting up the default thread value 
     MAX_PRIME=atoi(argv[1]); 
     NUM_THREADS =2; 
    } 

    else{ 
     MAX_PRIME=atoi(argv[1]); 
     NUM_THREADS=atoi(argv[2]); 

    } 


    //**************************** allocaion of memory 

    candidate = malloc((candidate+1)*sizeof(int)); 
    thread = malloc(NUM_THREADS*sizeof(pthread_t)); 

    long t; 

    // Start threads 
    for (t = 0; t < NUM_THREADS; t++) 
     pthread_create(&thread[t], NULL, prime_job, (void *) t); 

    // Join threads 
    for (t = 0; t < NUM_THREADS; t++) 
    { 
     void* numPrimesCalc; 
     pthread_join(thread[t], &numPrimesCalc); 
     printf("Thread %ld joined, calculated %ld prime numbers\n", t, (long) numPrimesCalc); 
    } 

    /* Print the largest prime it computed. */ 

    pthread_exit(NULL); 
} 
+3

我建議你應該適當地格式化你的代碼。 – MikeCAT

+0

我很困難,我對此很新。 – KBnd

+2

你的程序有什麼問題?它是否編譯?它運行嗎?你明白它在做什麼?你嘗試過調試嗎?你忘了問一個問題,這使我們很難回答。 –

回答

0
int compute_prime(int numPrime) 
{ 
    int candidate = 2; 
    while (1) 
    { 
     int factor; 
     int is_prime = 1; 

     /* Test primality by successive division. */ 
     for (factor = 2; factor < MAX_PRIME; ++factor) 
     { 
      if (candidate % factor == 0) 

如果你想測試,如果numPrime是素數,numPrime需求是在%的左側。否則,你會完全測試錯誤的數字。

您的for循環需要在您測試的編號之前停止。對於大於零的所有xx % x將爲零。因此,如果您測試包含您正在測試素數的數字的因素,則永遠不會找到任何素數。

另外,什麼是while (1)?這段代碼看起來像是貨物崇拜程序設計的結果,因爲它們可以幫助解決完全不同的問題而不理解。

+0

小心不要把'1'當作質數,如果你不想這樣考慮的話。 – MikeCAT

+0

代碼是這樣給出的,我不得不編輯並更改以獲取MAX_PRIME輸入的素數。我對整個事情感到非常困惑 – KBnd

+1

啊,所以你問錯了問題!你應該問的問題是「解釋這個代碼」,給出*原始*代碼。 (更準確地說,您應該詢問您不明白的代碼部分的具體問題。) –