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

第10話 第9話Ⅰの答え合わせ


私は派生スレッド:私は派生スレッド:0です。私は派生スレッド:1です。私は派生スレッド:4です。私は派生スレッド:3です。私は派生スレッド:5です。私は派生スレッド:6です。2私は派生スレッド:7です。です。私は派生スレッド:8私は派生スレッド:です。9です。私は派生スレッド:10です。私は派生スレッド:11です。私は派生スレッド:12です。私は派生スレッド:13です。私は派生スレッド:14です。私は派生スレッド:15です。

#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 size_t th = 16;

size_t 継続[th];//第11章第5話のようにしてもよいが5次で25個の1、6次で36個の1が必要になるので下記の赤色のようにして問題をクリア

int main() {

    clock_t hj, ow;

    hj = clock();  

    size_t ii[th];

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

        ii[i] = i;

        _beginthread(変身の術関数, 0, &ii[i]); //新しいスレッドを起動して、そのスレッド上で変身の術関数を展開せよの命令

    }

    while (1) {//全スレッドが終了するまで待機させる

        size_t 合計 = 0;

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

        if (合計 == 0)break;

    }

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

    return(0);

}

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

    size_t  a = *(size_t*)aa;

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

    継続[th] = 0;

}

Ⅱ 各スレッド毎部屋番号0にのみ生徒の出席番号を入れてください。

その際のⅠの表示は外します。

int main()の上に

size_t a[th][n][n];//魔方陣を形成するための作業用3次元配列

size_t y[th];//縦座標

size_t x[th];//横座標

size_t b[n][n];//y座標・x座標形成のための2次元配列

を定義して、魔方陣自動生成で使った

void 2次座標生成();のプロトタイプ宣言と本体も入れておいてください。

本体

void 2次座標生成() {//y横座標とx縦座標生成

    int i, j, c;

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            b[i][j] = -1;

        }

    }

    for (i = 0; i < n; i++) {

        b[i][i] = i;

    }

    c = n - 1;

    for (i = 0; i < n; i++) {

        if (b[i][n - 1 - i] == -1) {

            c++;

            b[i][n - 1 - i] = c;

        }

    }

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            if (b[i][j] == -1) {

                c++;

                b[i][j] = c;

            }

        }

    }

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            x[b[i][j]] = j;

            y[b[i][j]] = i;

        }

    }

}
も入れておいて、a[p][y[0]][x[0]]に生徒の出席番号を代入してコンソール画面への表示も忘れずに行ってください。


出席番号出席番号出席番号出席番号出席番号6 2出席番号 出席番号出席番号出席番号出席番号出席番号14 出席番号出席番号4 出席番号12 5 13 1 15 7 出席番号8 10 11 16 出席番号9 3


16のスレッドがコンソール画面に同時に書き込むので表示はぐちゃぐちゃになります。



に挑戦してください。



第11章第9話へ 第11章11話へ

本講義トップへ