第19講 gcnew Threadによるマルチスレッドプログラミング
第5話 素数探索マルチスレッド解答例
コード例
#include<iostream>
#include<math.h>
using namespace std;
using namespace System;
using namespace System::Threading;
const int N=10000000;
int cn1,cn2,cn3,cn4;
void f1();
void f2();
void f3();
void f4();
char h(int a);
int main(){
  DateTime^ hj=DateTime::Now;
  cn1=1;
  Thread^ a=gcnew Thread(gcnew ThreadStart(f1));
  Thread^ b=gcnew Thread(gcnew ThreadStart(f2));
  Thread^ c=gcnew Thread(gcnew ThreadStart(f3));
  Thread^ d=gcnew Thread(gcnew ThreadStart(f4));
  a->Start();
  b->Start();
  c->Start();
  d->Start();
  a->Join();
  b->Join();
  c->Join();
  d->Join();
  DateTime^ ow=DateTime::Now;
  TimeSpan sa=ow->Subtract(*hj);
  cout<<"素数の総数は"<<cn1+cn2+cn3+cn4<<"です。"<<endl;
  cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void f1(){
  int i;
  //cout<<"2"<<" ";
  for(i=3;i<=N;i+=8){
    if(h(i)){
      //cout<<i<<" ";
      cn1++;
    }
  }
  //cout<<endl;
}
void f2(){
  int i;
  //cout<<"2"<<" ";
  for(i=5;i<=N;i+=8){
    if(h(i)){
      //cout<<i<<" ";
      cn2++;
    }
  }
  //cout<<endl;
}
void f3(){
  int i;
  //cout<<"2"<<" ";
  for(i=7;i<=N;i+=8){
    if(h(i)){
      //cout<<i<<" ";
      cn3++;
    }
  }
  //cout<<endl;
}
void f4(){
  int i;
  //cout<<"2"<<" ";
  for(i=9;i<=N;i+=8){
    if(h(i)){
      //cout<<i<<" ";
      cn4++;
    }
  }
  //cout<<endl;
}
char h(int a){
  int i;
  for(i=3;i<=(int)sqrt((double)a);i+=2){
    if(a%i==0)return(0);
  }
  return(1);
}
マルチスレッド
シングルスレッド版
基礎
に比べると12/28です。
2倍以上速くなりました。

それでは皆さん、第2話の出来の悪かった普遍版魔方陣自動生成マルチスレッド版を.NETによって改良しましょう。


第4話へ 第6話へ

戻る

C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)