マルチスレッドプログラムを作成して、0〜100000000の素数の合計を見つけようとしています

スペンサーブルナート

こんにちは私はPOSIXスレッドライブラリを使用してC ++マルチスレッドプログラムを作成し、1から10,000,000(1000万)までの素数の数を見つけ、それが何マイクロ秒かかるかを調べようとしています...

スレッドを作成して実行することは完全に正常に機能しますが、数値が素数であるかどうかを判断するときに、素数関数でエラーが見つかったように感じます...

出力として78496を受け取り続けますが、664579が必要です。以下は私のコードです。ヒントやポインタをいただければ幸いです。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <sys/time.h> //measure the execution time of the computations

using namespace std;

//The number of thread to be generated
#define NUMBER_OF_THREADS 4

void * Prime(void* index);

long numbers[4] = {250000, 500000, 750000, 1000000};
long start_numbers[4] = {1, 250001, 500001, 750001};

int thread_numbers[4] = {0, 1, 2, 3};

int main(){
  pthread_t tid[NUMBER_OF_THREADS];

  int tn;

  long sum = 0;

  timeval start_time, end_time; 

  double start_time_microseconds, end_time_microseconds;

  gettimeofday(&start_time, NULL);

  start_time_microseconds = start_time.tv_sec * 1000000 + start_time.tv_usec;
  for(tn = 0; tn < NUMBER_OF_THREADS; tn++){
    if (pthread_create(&tid[tn], NULL, Prime, (void *) &thread_numbers[tn]) == -1 ) {
        perror("thread fail");
        exit(-1);
    }
  }
 long value[4];

 for(int i = 0; i < NUMBER_OF_THREADS; i++){
    if(pthread_join(tid[i],(void **) &value[i]) == 0){
        sum = sum + value[i]; //add four sums together
    }else{
      perror("Thread join failed");
      exit(-1);
    }
 }
 //get the end time in microseconds
 gettimeofday(&end_time, NULL);

 end_time_microseconds = end_time.tv_sec * 1000000 + end_time.tv_usec;

 //calculate the time passed
 double time_passed = end_time_microseconds - start_time_microseconds;

 cout << "Sum is: " << sum << endl;
 cout << "Running time is: " << time_passed << " microseconds" << endl;

 exit(0);
}


//Prime function
void* Prime(void* index){
  int temp_index;

  temp_index = *((int*)index);
  long  sum_t = 0;

  for(long i = start_numbers[temp_index]; i <= numbers[temp_index]; i++){
        for (int j=2; j*j <= i; j++)
        {
            if (i % j == 0) 
            {
                break;
            }
            else if (j+1 > sqrt(i)) {
                sum_t++;
            }
         }

  }

  cout << "Thread " << temp_index << " terminates" << endl;
  pthread_exit( (void*) sum_t);
}```
Deepak Tatyaji Ahire

これは、10 ^ 7ではなく10 ^ 6を使用したためです。

また、番号1、2、3のコーナーケースをいくつか追加しました。

//Prime function
void* Prime(void* index){
  int temp_index;

  temp_index = *((int*)index);
  long  sum_t = 0;

  for(long i = start_numbers[temp_index]; i <= numbers[temp_index]; i++){

      // Corner cases

      if(i<=1)continue;  
      if (i <= 3){
            sum_t++;
            continue;
      }


      for (int j=2; j*j <= i; j++)
      {
          if ((i % j == 0) ||  (i %( j+2))==0 ) 
          {
              break;
          }
          else if (j+1 > sqrt(i)) {
              sum_t++;
          }
       }

  }

    cout << "Thread " << temp_index << " terminates" << endl;
    pthread_exit( (void*) sum_t);
}

正しい数でコードをテストし、出力として正しい数の素数を取得しました。

Thread 0 terminates
Thread 1 terminates
Thread 2 terminates
Thread 3 terminates
Sum is: 664579
Running time is: 4.69242e+07 microseconds

@chuxに感謝します-これを指摘してくれたモニカを復活させてください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マルチスレッド: プログラムは 10 個のスレッドを作成し、メソッド print スレッドを呼び出して、このメソッドの出力が互いに干渉しないようにします。

分類Dev

なぜそれは裂けないのですか?Javaで2つのスレッド間で長時間ティアリングを示すサンプルプログラムを作成しようとしています

分類Dev

intとcharの値を合計するプログラムを作成しようとしています

分類Dev

ggplotすべてのグループの合計を見つけ、線としてプロットします

分類Dev

Cプログラムを使用して単語のスクラブル値を見つけようとしています

分類Dev

Javaで200万未満の素数の合計を見つけようとしています

分類Dev

javascriptで素数の合計を見つけようとしているときのバグ

分類Dev

私のプログラムの何が問題になっていますか?nからmまでの素数のリストを見つけようとしています

分類Dev

配列内の2つの項目を合計するプログラムを作成しようとしています

分類Dev

ドライブのリストをバッチで見つけようとしています

分類Dev

マルチスレッドに焦点を当てたScalaチュートリアルを見つけようとしています

分類Dev

個々の列の合計を見つけようとしています

分類Dev

ヒストグラムが線として表示されます:値が見つからない場合は0のプロットを強制します

分類Dev

スレッドプールのサイズが実行されたタスクの数よりも小さい場合、newFixedThreadPoolを使用するマルチスレッドプログラムが例外として実行されない

分類Dev

Javaマルチスレッドプログラムはどのようにして複数のCPUコアを使用できますか?

分類Dev

チェックサム ファイルの検証プロセスを作成しようとしています

分類Dev

ゴールドバッハの予想-2つの素数の合計として偶数を書くことができる方法の数を見つけます

分類Dev

プログラムの実行時にpycharmが起動しているコマンドを見つけます

分類Dev

配列内の素数を見つけようとしています

分類Dev

このマルチスレッドJavaアプリケーションでは、1つのスレッドのみが順次プログラムのように実行されているように見えますか?

分類Dev

lexプログラムのmakefileを作成しようとしています

分類Dev

2つのスレッド間にデッドロックを作成しようとしています

分類Dev

グループ化してグループの合計を見つけますが、NaNを0ではなくNaNとして返します

分類Dev

Javaクラス、初期値を見つけるメソッドを作成しようとしています

分類Dev

このプログラムを高速化してフィボナッチ数列を見つけるにはどうすればよいですか

分類Dev

リストの合計の重複を見つけようとしています

分類Dev

マルチスレッドプログラムが新しいプロセスを作成するとどうなりますか?

分類Dev

プロパティ ファイルで見つからないキーの apt Java コード ロジックを見つけようとしています

分類Dev

2つの別々のファイルを結合しようとしていますが、プログラムが機能していません

Related 関連記事

  1. 1

    マルチスレッド: プログラムは 10 個のスレッドを作成し、メソッド print スレッドを呼び出して、このメソッドの出力が互いに干渉しないようにします。

  2. 2

    なぜそれは裂けないのですか?Javaで2つのスレッド間で長時間ティアリングを示すサンプルプログラムを作成しようとしています

  3. 3

    intとcharの値を合計するプログラムを作成しようとしています

  4. 4

    ggplotすべてのグループの合計を見つけ、線としてプロットします

  5. 5

    Cプログラムを使用して単語のスクラブル値を見つけようとしています

  6. 6

    Javaで200万未満の素数の合計を見つけようとしています

  7. 7

    javascriptで素数の合計を見つけようとしているときのバグ

  8. 8

    私のプログラムの何が問題になっていますか?nからmまでの素数のリストを見つけようとしています

  9. 9

    配列内の2つの項目を合計するプログラムを作成しようとしています

  10. 10

    ドライブのリストをバッチで見つけようとしています

  11. 11

    マルチスレッドに焦点を当てたScalaチュートリアルを見つけようとしています

  12. 12

    個々の列の合計を見つけようとしています

  13. 13

    ヒストグラムが線として表示されます:値が見つからない場合は0のプロットを強制します

  14. 14

    スレッドプールのサイズが実行されたタスクの数よりも小さい場合、newFixedThreadPoolを使用するマルチスレッドプログラムが例外として実行されない

  15. 15

    Javaマルチスレッドプログラムはどのようにして複数のCPUコアを使用できますか?

  16. 16

    チェックサム ファイルの検証プロセスを作成しようとしています

  17. 17

    ゴールドバッハの予想-2つの素数の合計として偶数を書くことができる方法の数を見つけます

  18. 18

    プログラムの実行時にpycharmが起動しているコマンドを見つけます

  19. 19

    配列内の素数を見つけようとしています

  20. 20

    このマルチスレッドJavaアプリケーションでは、1つのスレッドのみが順次プログラムのように実行されているように見えますか?

  21. 21

    lexプログラムのmakefileを作成しようとしています

  22. 22

    2つのスレッド間にデッドロックを作成しようとしています

  23. 23

    グループ化してグループの合計を見つけますが、NaNを0ではなくNaNとして返します

  24. 24

    Javaクラス、初期値を見つけるメソッドを作成しようとしています

  25. 25

    このプログラムを高速化してフィボナッチ数列を見つけるにはどうすればよいですか

  26. 26

    リストの合計の重複を見つけようとしています

  27. 27

    マルチスレッドプログラムが新しいプロセスを作成するとどうなりますか?

  28. 28

    プロパティ ファイルで見つからないキーの apt Java コード ロジックを見つけようとしています

  29. 29

    2つの別々のファイルを結合しようとしていますが、プログラムが機能していません

ホットタグ

アーカイブ