マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第11章 マルチスレッドプログラミング

第7話 シングルスレッド対4スレッド 両コードとそれぞれの実験結果

第5話改良コード

#pragma warning(disable: 4996)//第2編のために必要

#include<iostream>//インクルードファイルiostreamの読み込み

#include<conio.h>//while(!_kbhit());を使うためのお呪い

#include<string> //文字列変数を使えるようにするために組み込む

#include <iomanip> //setprecisionを使えるように組み込む

#include <cmath>//powなどを使うときに必要

#include <ctime>//time()(←現時刻発生する関数)を使うために必要

using namespace std;//coutを使うときに必要なお呪い

#include <process.h>//_beginthreadを使うために必要

void 素数生成1();//8 * m + 1 タイプの素数を生成

void 素数生成2();//8 * m + 3 タイプの素数を生成

void 素数生成3();//8 * m + 5 タイプの素数を生成

void 素数生成4();//8 * m + 7 タイプの素数を生成

int 素数判定(int x);//素数判定関数

int s[4][400000];//8 * m + 2 * a + 1 タイプの素数を収納する

int cn[4] = { 0,0,0,0 };//8 * m + 2 * a + 1 タイプの素数をカウントする変数

int main() {

    clock_t hj, ow;

    hj = clock();

    素数生成1();//8 * m + 1 タイプの素数を生成

    素数生成2();//8 * m + 3 タイプの素数を生成

    素数生成3();//8 * m + 5 タイプの素数を生成

    素数生成4();//8 * m + 7 タイプの素数を生成

    ow = clock();

    cout << 2 << endl << endl;

    for (int i = 0; i < 4; i++) {

        for (int j = 0; j < cn[i]; j++) {

            cout << s[i][j] << " ";

        }

        cout << endl << endl;

    }

    cout << "素数生成時間は" << (double)(ow - hj) / CLOCKS_PER_SEC << "秒です。" << endl;

    cout << "生成された素数は総数は" << cn[0] + cn[1] + cn[2] + cn[3] + 1 << "個です。" << endl;

    while (!_kbhit());//待機させるための命令

    return(0);

}

void 素数生成1() {//8 * m + 1 タイプの素数を生成

    for (int i = 0; i < 1250000; i++) {

        if (素数判定(8 * i + 1) == 1) {

            s[0][cn[0]] = 8 * i + 1;

            cn[0]++;

        }

    }

}

void 素数生成2() {//8 * m + 3 タイプの素数を生成

    for (int i = 0; i < 1250000; i++) {

        if (素数判定(8 * i + 3) == 1) {

            s[1][cn[1]] = 8 * i + 3;

            cn[1]++;

        }

    }

}

void 素数生成3() {//8 * m + 5 タイプの素数を生成

    for (int i = 0; i < 1250000; i++) {

        if (素数判定(8 * i + 5) == 1) {

            s[2][cn[2]] = 8 * i + 5;

            cn[2]++;

        }

    }

}

void 素数生成4() {//8 * m + 7 タイプの素数を生成

    for (int i = 0; i < 1250000; i++) {

        if (素数判定(8 * i + 7) == 1) {

            s[3][cn[3]] = 8 * i + 7;

            cn[3]++;

        }

    }

}

int 素数判定(int x) {//素数判定関数

    if (x == 1)return(0);

 if (x == 2)return(1);

    if (x % 2 == 0)return(0);

    int 最後 = sqrt(x);//割り算をする最後の数字

    for (int i = 3; i <= 最後; i++) {

        if (x % i == 0)return(0);

    }

    return(1);

}




両者共に1250回版では差が出なかったので1250000回版にして実験しました。

実験結果
シングル版



第11章第6話へ 第11章8話へ

本講義トップへ