2016-04-08 11 views
1

私はXからYまでのすべての素数を計算し、異なるPThread間で計算を分割しようとしています。素数の計算PThread

ので、例えば:

NUM1 = 4 
NUM2 = 40 
NUMOFTHREADS = 3 
NUM2 - NUM1 = 36 

3分の36 = 12ので、各スレッドは、12回の計算を持っているでしょう。スレッド1は4から16まで、スレッド2は16から28まで、スレッド3は28から36まで。その後、結果を加算します。

私は数多くのサンプルをオンラインで読んできましたが、彼らは役に立たないようです。そこで、私は自分のバージョンのPThreadsのための独自のチェッカーを実装しました。

予想される出力:

Thread 1 calculated: 5, 7, 11, 13 
Thread 2 calculated: 17, 19, 23 
Thread 3 calculated: 29, 31, 37 

ここでは私のコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <pthread.h> 
#define NUM1 4 
#define NUM2 80 
#define NUMOFTHREADS 3 

/* Prototypes */ 
void *printPrimeThreadCalculation(void *threadid); 
void primeCheckerThread(int num1, int num2, int numOfThreads); 

int main() { 

    /* Thread Prime Checker */ 
    primeCheckerThread(NUM1, NUM2, NUMOFTHREADS); 
    /* Exits the threads */ 
    pthread_exit(NULL); 
    return 0; 
} 

void *printPrimeThreadCalculation(void *threadid) { 
    long tid; 
    tid = (long) threadid; 

    int number1 = NUM1; 
    int number2 = NUM2; 
    int isPrime, i; 

    /* Calculations */ 
    while (number1 <= number2) { 
     /* Assume isPrime is true */ 
     isPrime = 1; 

     for (i = 2; i < number1 && isPrime; i++) { 
      if (number1 % i == 0) { 
       isPrime = 0; 
      } 
     } 
     if (isPrime == 1) { 
      printf("%d ", number1); 
     } 
     number1++; 
    } 
    printf("\n"); 
} 

void primeCheckerThread(int num1, int num2, int numOfThreads) { 
    /* Create threads */ 
    pthread_t threads[numOfThreads]; 
    int rc; 
    long t; 
    for (t = 0; t < numOfThreads; t++) { 
     /* Creates threads */ 
     rc = pthread_create(&threads[t], NULL, printPrimeThreadCalculation, (void *)t); 
     if (rc) { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
     } 
    } 
} 

私が期待される出力を得るために、これを実装する方法上の任意の手がかり?

+2

希望の結果ではなく、結果として得られた結果が表示されていないか、問題の内容が説明されています。 –

+0

@SamKuhmonenまあ、私は、数字1から数2までの素数を計算するための計算をマルチスレッド化する方法を混乱させているだけです。しかし、私はそれを正しく設定していると思いますが、私の良心は間違っていると私に言っています。 – Anon

+1

あなたのすべてのスレッドは、 'NUM1'と' NUM2'の間のすべての素数を計算しています。小さな間隔に拘束したい場合は、その間隔をスレッド関数に伝える必要があります。 – molbdnilo

答えて

1
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <pthread.h> 
#define NUM1 4 
#define NUM2 40 
#define NUMOFTHREADS 3 

/* Prototypes */ 
void *printPrimeThreadCalculation(void *threadid); 
void primeCheckerThread(int num1, int num2, int numOfThreads); 

int main() { 

    /* Thread Prime Checker */ 
    primeCheckerThread(NUM1, NUM2, NUMOFTHREADS); 
    /* Exits the threads */ 
    pthread_exit(NULL); 
    return 0; 
} 

void *printPrimeThreadCalculation(void *threadid) { 
    long tid; 
    tid = (long) threadid; 
    static int cnt=0; //cnt=count 
    int number1 = NUM1+(NUM2-NUM1)*cnt/NUMOFTHREADS; 
    int number2 = NUM1+(NUM2-NUM1)*(cnt+1)/NUMOFTHREADS; 
    cnt+=1; 
    int isPrime, i; 

    /* Calculations */ 
    while (number1 <= number2) { 
     /* Assume isPrime is true */ 
     isPrime = 1; 

     for (i = 2; i < number1 && isPrime; i++) { 
      if (number1 % i == 0) { 
       isPrime = 0; 
      } 
     } 
     if (isPrime == 1) { 
      printf("%d ", number1); 
     } 
     number1++; 
    } 
    printf("\n"); 
} 

void primeCheckerThread(int num1, int num2, int numOfThreads) { 
    /* Create threads */ 
    pthread_t threads[numOfThreads]; 
    int rc; 
    long t; 
    for (t = 0; t < numOfThreads; t++) { 
     /* Creates threads */ 
     rc = pthread_create(&threads[t], NULL, printPrimeThreadCalculation, (void *)t); 
     if (rc) { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
     } pthread_join(threads[t],NULL); 

    } 

} 
+0

行番号6を参照してください、NUM2は40にする必要があります。25行目から28行目では、numberの範囲を更新するためにcounterを追加し、60行目でpthread_join呼び出しを追加して別のスレッドを呼び出すための最初のスレッドの実行を待ちます。 – kamlesh