第21講 並び換え

第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スレッドの場合
p
シングルスレッドの場合
u
14688/9625≒1.58
ですから、1.58倍加に成功しました。
スレッド数が多いほど早くなると予想していましたが、
2スレッドの場合
y
14688/8918≒1.65
2スレッドの方が早い結果となりました。

プログラミングの場合、思考実験も大切ですが、
実際に組んで試してみる必要があります。

大幅な改善ではありませんでしたが、
一応マルチスレッド化して1.65倍加に成功したことに満足して、
第21講を終了したいと思います。
第22講では、10進数をn進数に翻訳する方法を考えます。

第9話へ 第22講第1話へ

a

eclipse c++ 入門講義第1部へ

eclipse c++ 入門講義第2部へ


魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ