第18講 マルチスレッドプログラミング=並列処理プログラミング

第5話 7スレッド素数探索プログラム

j
を6スレッドで実現するプログラム例
#include<iostream>
#include<process.h>
#include<math.h>
using namespace std;
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 sh(int i);
char t1,t2,t3,t4,t5,t6;
int cn1,cn2,cn3,cn4,cn5,cn6;
long s1[10000000],s2[10000000],s3[10000000],s4[10000000],s5[10000000],s6[10000000];
void main(){
   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);
   int i;
   cout<<"7で割ると1余る素数"<<endl;
   for(i=0;i<cn1;i++){
     cout<<s1[i]<<" ";
     if(i>0 && i%10==0)cout<<endl;
   }
   cout<<endl;
   cout<<"7で割ると2余る素数"<<endl;
   for(i=0;i<cn2;i++){
     cout<<s2[i]<<" ";
     if(i>0 && i%10==0)cout<<endl;
   }
   cout<<endl;
   cout<<"7で割ると3余る素数"<<endl;
   for(i=0;i<cn3;i++){
     cout<<s3[i]<<" ";
     if(i>0 && i%10==0)cout<<endl;
   }
   cout<<endl;
   cout<<"7で割ると4余る素数"<<endl;
   for(i=0;i<cn4;i++){
     cout<<s4[i]<<" ";
     if(i>0 && i%10==0)cout<<endl;
   }
   cout<<endl;
   cout<<"7で割ると5余る素数"<<endl;
   for(i=0;i<cn5;i++){
     cout<<s5[i]<<" ";
     if(i>0 && i%10==0)cout<<endl;
   }
   cout<<endl;
   cout<<"7で割ると6余る素数"<<endl;
   for(i=0;i<cn6;i++){
     cout<<s6[i]<<" ";
     if(i>0 && i%10==0)cout<<endl;
   }
}
void f1(void *a){//7で割ると1余る素数の探索
   cn1=0;
   for(int i=1;i<1001;i+=7){
    if(sh(i)){
       s1[cn1]=i;
       cn1++;
    }
   }
   t1=0;
}
void f2(void *a){//7で割ると2余る素数の探索
   cn2=0;
   for(int i=2;i<1001;i+=7){
    if(sh(i)){
       s2[cn2]=i;
       cn2++;
    }
   }
   t2=0;
}
void f3(void *a){//7で割ると3余る素数の探索
   cn3=0;
   for(int i=3;i<1001;i+=7){
    if(sh(i)){
       s3[cn3]=i;
       cn3++;
    }
   }
   t3=0;
}
void f4(void *a){//7で割ると4余る素数の探索
   cn4=0;
   for(int i=4;i<1001;i+=7){
    if(sh(i)){
       s4[cn4]=i;
       cn4++;
    }
   }
   t4=0;
}
void f5(void *a){//7で割ると5余る素数の探索
   cn5=0;
   for(int i=5;i<1001;i+=7){
    if(sh(i)){
       s5[cn5]=i;
       cn5++;
    }
   }
   t5=0;
}
void f6(void *a){//7で割ると6余る素数の探索
   cn6=0;
   for(int i=6;i<1001;i+=7){
    if(sh(i)){
       s6[cn6]=i;
       cn6++;
    }
   }
   t6=0;
}
char sh(int g){
   if(g==1)return(0);
   if(g==2)return(1);
   if(g==3)return(1);
   if(g>0 && g%2==0)return(0);
   for(int i=3;i<=sqrt((double)g);i+=2)if(g%i==0)return(0);
   return(1);
}
参考ダウンロード添付ファイル


それぞれのi<1001のところをi<100000001と変えて実験すると、
g

とCPU使用率100%が実現できています。
実行結果の一部
f

プログラムの解説は次話で行います。


第4話へ 第6話へ

a

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

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