マルチスレッド版数独自動生成ソフト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回版にして実験しました。
実験結果
シングル版
