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

第5話 第4話答え合わせと、そしてマルチスレッドを体験する!

実行結果


2

17 41 73 89 97 113 137 193 233 241 257 281 313 337 353 401 409 433 449 457 521 569 577 593 601 617 641 673 761 769 809 857 881 929 937 953 977 1009 1033 1049 1097 1129 1153 1193 1201 1217 1249 1289 1297 1321 1361 1409 1433 1481 1489 1553 1601 1609 1657 1697 1721 1753 1777 1801 1873 1889 1913 1993 2017 2081 2089 2113 2129 2137 2153 2161 2273 2281 2297 2377 2393 2417 2441 2473 2521 2593 2609 2617 2633 2657 2689 2713 2729 2753 2777 2801 2833 2857 2897 2953 2969 3001 3041 3049 3089 3121 3137 3169 3209 3217 3257 3313 3329 3361 3433 3449 3457 3529 3593 3617 3673 3697 3761 3769 3793 3833 3881 3889 3929 4001 4049 4057 4073 4129 4153 4177 4201 4217 4241 4273 4289 4297 4337 4409 4441 4457 4481 4513 4561 4649 4657 4673 4721 4729 4793 4801 4817 4889 4937 4969 4993 5009 5081 5113 5153 5209 5233 5273 5281 5297 5393 5417 5441 5449 5521 5569 5641 5657 5689 5737 5801 5849 5857 5881 5897 5953 6073 6089 6113 6121 6217 6257 6329 6337 6353 6361 6449 6473 6481 6521 6529 6553 6569 6577 6673 6689 6737 6761 6793 6833 6841 6857 6961 6977 7001 7057 7121 7129 7177 7193 7297 7321 7369 7393 7417 7433 7457 7481 7489 7529 7537 7561 7577 7649 7673 7681 7753 7793 7817 7841 7873 7937 7993 8009 8017 8081 8089 8161 8209 8233 8273 8297 8329 8353 8369 8377 8513 8521 8537 8609 8641 8681 8689 8713 8737 8753 8761 8849 8929 8969 9001 9041 9049 9137 9161 9209 9241 9257 9281 9337 9377 9433 9473 9497 9521 9601 9649 9689 9697 9721 9769 9817 9833 9857 9929

3 11 19 43 59 67 83 107 131 139 163 179 211 227 251 283 307 331 347 379 419 443 467 491 499 523 547 563 571 587 619 643 659 683 691 739 787 811 827 859 883 907 947 971 1019 1051 1091 1123 1163 1171 1187 1259 1283 1291 1307 1427 1451 1459 1483 1499 1523 1531 1571 1579 1619 1627 1667 1699 1723 1747 1787 1811 1867 1907 1931 1979 1987 2003 2011 2027 2083 2099 2131 2179 2203 2243 2251 2267 2339 2347 2371 2411 2459 2467 2531 2539 2579 2659 2683 2699 2707 2731 2803 2819 2843 2851 2939 2963 2971 3011 3019 3067 3083 3163 3187 3203 3251 3259 3299 3307 3323 3331 3347 3371 3467 3491 3499 3539 3547 3571 3643 3659 3691 3739 3779 3803 3851 3907 3923 3931 3947 4003 4019 4027 4051 4091 4099 4139 4211 4219 4243 4259 4283 4339 4363 4451 4483 4507 4523 4547 4603 4643 4651 4691 4723 4787 4931 4987 5003 5011 5051 5059 5099 5107 5147 5171 5179 5227 5323 5347 5387 5419 5443 5483 5507 5531 5563 5651 5659 5683 5779 5827 5843 5851 5867 5923 5939 5987 6011 6043 6067 6091 6131 6163 6203 6211 6299 6323 6379 6427 6451 6491 6547 6563 6571 6619 6659 6691 6763 6779 6803 6827 6883 6899 6907 6947 6971 7019 7027 7043 7187 7211 7219 7243 7283 7307 7331 7411 7451 7459 7499 7507 7523 7547 7603 7643 7691 7699 7723 7867 7883 7907 7963 8011 8059 8123 8147 8171 8179 8219 8243 8291 8363 8387 8419 8443 8467 8539 8563 8627 8699 8707 8731 8747 8779 8803 8819 8867 8923 8963 8971 9011 9043 9059 9067 9091 9187 9203 9227 9283 9323 9371 9403 9419 9467 9491 9539 9547 9587 9619 9643 9739 9787 9803 9811 9851 9859 9883 9907 9923 9931

5 13 29 37 53 61 101 109 149 157 173 181 197 229 269 277 293 317 349 373 389 397 421 461 509 541 557 613 653 661 677 701 709 733 757 773 797 821 829 853 877 941 997 1013 1021 1061 1069 1093 1109 1117 1181 1213 1229 1237 1277 1301 1373 1381 1429 1453 1493 1549 1597 1613 1621 1637 1669 1693 1709 1733 1741 1789 1861 1877 1901 1933 1949 1973 1997 2029 2053 2069 2141 2213 2221 2237 2269 2293 2309 2333 2341 2357 2381 2389 2437 2477 2549 2557 2621 2677 2693 2741 2749 2789 2797 2837 2861 2909 2917 2957 3037 3061 3109 3181 3221 3229 3253 3301 3373 3389 3413 3461 3469 3517 3533 3541 3557 3581 3613 3637 3677 3701 3709 3733 3797 3821 3853 3877 3917 3989 4013 4021 4093 4133 4157 4229 4253 4261 4349 4357 4373 4397 4421 4493 4517 4549 4597 4621 4637 4733 4789 4813 4861 4877 4909 4933 4957 4973 5021 5077 5101 5189 5197 5237 5261 5309 5333 5381 5413 5437 5477 5501 5557 5573 5581 5653 5669 5693 5701 5717 5741 5749 5813 5821 5861 5869 5981 6029 6037 6053 6101 6133 6173 6197 6221 6229 6269 6277 6301 6317 6373 6389 6397 6421 6469 6581 6637 6653 6661 6701 6709 6733 6781 6829 6869 6917 6949 6997 7013 7069 7109 7213 7229 7237 7253 7309 7333 7349 7477 7517 7541 7549 7573 7589 7621 7669 7717 7741 7757 7789 7829 7853 7877 7901 7933 7949 8053 8069 8093 8101 8117 8221 8237 8269 8293 8317 8389 8429 8461 8501 8573 8581 8597 8629 8669 8677 8693 8741 8821 8837 8861 8893 8933 8941 9013 9029 9109 9133 9157 9173 9181 9221 9277 9293 9341 9349 9397 9413 9421 9437 9461 9533 9613 9629 9661 9677 9733 9749 9781 9829 9901 9941 9949 9973

7 23 31 47 71 79 103 127 151 167 191 199 223 239 263 271 311 359 367 383 431 439 463 479 487 503 599 607 631 647 719 727 743 751 823 839 863 887 911 919 967 983 991 1031 1039 1063 1087 1103 1151 1223 1231 1279 1303 1319 1327 1367 1399 1423 1439 1447 1471 1487 1511 1543 1559 1567 1583 1607 1663 1759 1783 1823 1831 1847 1871 1879 1951 1999 2039 2063 2087 2111 2143 2207 2239 2287 2311 2351 2383 2399 2423 2447 2503 2543 2551 2591 2647 2663 2671 2687 2711 2719 2767 2791 2879 2887 2903 2927 2999 3023 3079 3119 3167 3191 3271 3319 3343 3359 3391 3407 3463 3511 3527 3559 3583 3607 3623 3631 3671 3719 3727 3767 3823 3847 3863 3911 3919 3943 3967 4007 4079 4111 4127 4159 4231 4271 4327 4391 4423 4447 4463 4519 4567 4583 4591 4639 4663 4679 4703 4751 4759 4783 4799 4831 4871 4903 4919 4943 4951 4967 4999 5023 5039 5087 5119 5167 5231 5279 5303 5351 5399 5407 5431 5471 5479 5503 5519 5527 5591 5623 5639 5647 5711 5743 5783 5791 5807 5839 5879 5903 5927 6007 6047 6079 6143 6151 6199 6247 6263 6271 6287 6311 6343 6359 6367 6551 6599 6607 6679 6703 6719 6791 6823 6863 6871 6911 6959 6967 6983 6991 7039 7079 7103 7127 7151 7159 7207 7247 7351 7487 7559 7583 7591 7607 7639 7687 7703 7727 7759 7823 7879 7919 7927 7951 8039 8087 8111 8167 8191 8231 8263 8287 8311 8423 8431 8447 8527 8543 8599 8623 8647 8663 8719 8783 8807 8831 8839 8863 8887 8951 8999 9007 9103 9127 9151 9199 9239 9311 9319 9343 9391 9431 9439 9463 9479 9511 9551 9623 9631 9679 9719 9743 9767 9791 9839 9871 9887 9967

素数生成時間は0.078秒です。
生成された素数は総数は1229個です。

を実現するコード例

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

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

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

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

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

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

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

const int n = 10000;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!

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

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

int s1[400];//8 * m + 1 タイプの素数を収納する

int cn1 = 0;//8 * m + 1 タイプの素数をカウントする変数

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

int s2[400];//8 * m + 3 タイプの素数を収納する

int cn2 = 0;//8 * m + 3 タイプの素数をカウントする変数

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

int s3[400];//8 * m + 5 タイプの素数を収納する

int cn3 = 0;//8 * m + 5 タイプの素数をカウントする変数

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

int s4[400];//8 * m + 7 タイプの素数を収納する

int cn4 = 0;//8 * m + 7 タイプの素数をカウントする変数

int main() {

    clock_t hj, ow;

    hj = clock();

    cout << 2 << endl << endl;

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

    for (int i = 0; i < cn1; i++)cout << s1[i] << " ";

    cout << endl << endl;

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

    for (int i = 0; i < cn2; i++)cout << s2[i] << " ";

    cout << endl << endl;

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

    for (int i = 0; i < cn3; i++)cout << s3[i] << " ";

    cout << endl << endl;

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

    for (int i = 0; i < cn4; i++)cout << s4[i] << " ";

    cout << endl << endl;

    ow = clock();

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

    cout << "生成された素数は総数は" << cn1 + cn2 + cn3 + cn4 + 1 << "個です。" << endl;

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

    return(0);

}

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

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

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

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

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

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

    }

    return(1);

}

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

    for (int i = 1; i < 1251; i++){

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

            s1[cn1] = 8 * i + 1;

            cn1++;

        }

    }

}

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

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

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

            s2[cn2] = 8 * i + 3;

            cn2++;

        }

    }

}

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

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

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

            s3[cn3] = 8 * i + 5;

            cn3++;

        }

    }

}

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

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

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

            s4[cn4] = 8 * i + 7;

            cn4++;

        }

    }

}


ではマルチスレッドにするにはどうしたらよいか、

コード例を示すます。

#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 変身の術関数(void* aa);//スレッドを派生させる関数

const int th = 8;

int 継続[th] = { 1,1,1,1,1,1,1,1 };

int main() {

    clock_t hj, ow;

    hj = clock();

    int ii[th];

    for (int i = 0; i < th; i += 1) {

        ii[i] = i;

        _beginthread(変身の術関数, 0, &ii[i]); //新しいスレッドを起動して、そのスレッド上で関数問題生成関数を働かせなさいの命令

    }

    while (1) {

        int 合計 = 0;

        for (int i = 0; i < th; i++)合計 += 継続[i];

        if (合計 == 0)break;

    }

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

    return(0);

}

void 変身の術関数(void* aa) {//マルチスレッド

    int  a = *(int*)aa;

    cout << "私は派生スレッド:" << a << "です。";

    継続[th] = 0;

}

実験結果




マルチスレッドであるために結果が毎回異なる。スレッドが同時に書き込むのでコンソール画面はぐちゃぐちゃになる!

ヒントを書いておきましょう。

上の2つのプログラムコードを合体させれば、マルチスレッド版素数生成プログラムは完成します。

マルチスレッド版にシングルスレッド版のコード組み込めば完成します。

ただし、const int th = 8;//スレッド数 と int 継続[th] = { 1,1,1,1,1,1,1,1 }; は変更が必要です。

int s1[400];//8 * m + 1 タイプの素数を収納する

int cn1 = 0;//8 * m + 1 タイプの素数をカウントする変数

に等は

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

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

に一本化しておいてください。s1[400]とcn1の1の部分が変数変数で扱えないからです。

実験結果をいつもは載せますが、

マルチスレッド効果がわかってしまいますので、

次話に載せます。

 



第11章第4話へ 第11章6話へ

本講義トップへ