第10話 マルチスレッド並び換えプログラム例
#include<iostream>
#include<ctime>
#include<process.h>
using namespace std;
void f(int* x);
void g(int* x,int n);
void h(int* x);
void f1(void *a);
void f2(void *a);
void f3(void *a);
void f4(void *a);
void f5(void *a);
void f6(void *a);
char t1,t2,t3,t4,t5,t6;
int x[60000];
void main(){
//srand(time(NULL)); //比較のために一端外してある。
f(x);
h(x);
clock_t hj,ow; //clock_t型の宣言、プログラム開始時間を取得するための変数
hj=clock();
t1=1;
t2=1;
t3=1;
t4=1;
t5=1;
t6=1;
_beginthread(f1,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f1を働かせなさいの命令
_beginthread(f2,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f2を働かせなさいの命令
_beginthread(f3,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f3を働かせなさいの命令
_beginthread(f4,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f4を働かせなさいの命令
_beginthread(f5,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f5を働かせなさいの命令
_beginthread(f6,0,NULL); //新しいスレッドを起動して、そのスレッド上で関数f6を働かせなさいの命令
while (t1);
while (t2);
while (t3);
while (t4);
while (t5);
while (t6);
g(x,60000);
ow=clock();
cout<<endl;
h(x);
cout<<"並び換えにかかった時間は"<<(double)(ow-hj)/1<<"秒です。"<<endl;
cout<<"プロジェクト終了"<<endl;
}
void f(int* x){
int i;
for(i=0;i<60000;i++)x[i]=rand()%10000;
}
void f1(void *a){
int x1[10000],i;
for(i=0;i<10000;i++)x1[i]=x[i];
g(x1,10000);
for(i=0;i<10000;i++)x[i]=x1[i];
t1=0;
}
void f2(void *a){
int x2[10000],i;
for(i=10000;i<20000;i++)x2[i-10000]=x[i];
g(x2,10000);
for(i=10000;i<20000;i++)x[i]=x2[i-10000];
t2=0;
}
void f3(void *a){
int x3[10000],i;
for(i=20000;i<30000;i++)x3[i-20000]=x[i];
g(x3,10000);
for(i=20000;i<30000;i++)x[i]=x3[i-20000];
t3=0;
}
void f4(void *a){
int x4[10000],i;
for(i=30000;i<40000;i++)x4[i-30000]=x[i];
g(x4,10000);
for(i=30000;i<40000;i++)x[i]=x4[i-30000];
t4=0;
}
void f5(void *a){
int x5[10000],i;
for(i=40000;i<50000;i++)x5[i-40000]=x[i];
g(x5,10000);
for(i=40000;i<50000;i++)x[i]=x5[i-40000];
t5=0;
}
void f6(void *a){
int x6[10000],i;
for(i=50000;i<60000;i++)x6[i-50000]=x[i];
g(x6,10000);
for(i=50000;i<60000;i++)x[i]=x6[i-50000];
t6=0;
}
void h(int* x){
int i;
for(i=0;i<60000;i++){
cout<<x[i]<<" ";
if(i>0 && (i+1)%10==0)cout<<endl;
}
cout<<endl;
}
void g(int* x,int n){
int i,cn;
while(1){
cn=0;
for(i=0000;i<n-1;i++){
if(x[i]>x[i+1]){
int w;
w=x[i];
x[i]=x[i+1];
x[i+1]=w;
cn++;
}
}
if(cn==0)break;
}
}
参考ダウンロード添付ファイル
実験結果
6スレッドの場合
シングルスレッドの場合
14688/9625≒1.58
ですから、1.58倍加に成功しました。
スレッド数が多いほど早くなると予想していましたが、
2スレッドの場合
14688/8918≒1.65
2スレッドの方が早い結果となりました。
プログラミングの場合、思考実験も大切ですが、
実際に組んで試してみる必要があります。
大幅な改善ではありませんでしたが、
一応マルチスレッド化して1.65倍加に成功したことに満足して、
第21講を終了したいと思います。
第22講では、10進数をn進数に翻訳する方法を考えます。