第19講 .NETによるマルチスレッドプログラミング
第4話 和マルチスレッド解答例
コード例
#include<iostream>
using namespace std;
using namespace System;
using namespace System::Threading;
void f();
void g();
void h();
void i();
int w1,w2,w3,w4;
int main(){
  DateTime^ hj=DateTime::Now;
  Thread^ a=gcnew Thread(gcnew ThreadStart(f));
  Thread^ b=gcnew Thread(gcnew ThreadStart(g));
  Thread^ c=gcnew Thread(gcnew ThreadStart(h));
  Thread^ d=gcnew Thread(gcnew ThreadStart(i));
  a->Start();
  b->Start();
  c->Start();
  d->Start();
  a->Join();
  b->Join();
  c->Join();
  d->Join();
  cout<<w1+w2+w3+w4<<endl;
  DateTime^ ow=DateTime::Now;
  TimeSpan sa=ow->Subtract(*hj);
  cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void f(){
  w1=0;
  int i;
  for(i=1;i<2501;i++)w1+=i;
}
void g(){
  w2=0;
  int i;
  for(i=2501;i<5001;i++)w2+=i;
}
void h(){
  w3=0;
  int i;
  for(i=5001;i<7501;i++)w3+=i;
}
void i(){
  w4=0;
  int i;
  for(i=7501;i<10001;i++)w1+=i;
}
実行画面
入門

  a->Join();
  b->Join();
  c->Join();
  d->Join();
を試しに取り除いて実験すると、
マルチスレッド
これはまだ起動したスレッドが計算中にルートスレッドが表示してしまって、
正しく表示されないわけです。
ですから、待機させる命令が必要なのです。

実は、これぐらいの計算ならシングルスレッドでも変わりありません。
そこで、gcnew Threadを利用したマルチスレッド版素数探索ソフトを作って、
マルチスレッドの方が速いことを体感してみましょう。
条件を整えるため比較シングルスレッドのコードは
#include<iostream>
#include<math.h>
using namespace std;
using namespace System;
const int N=10000000;
int cn;
void f();
char h(int a);
int main(){
  DateTime^ hj=DateTime::Now;
  cn=1;
  f();
  DateTime^ ow=DateTime::Now;
  TimeSpan sa=ow->Subtract(*hj);
  cout<<"素数の総数は"<<cn<<"です。"<<endl;
  cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
}
void f(){
  int i;
  //cout<<"2"<<" ";
  for(i=3;i<=N;i+=2){
    if(h(i)){
      //cout<<i<<" ";
      cn++;
    }
  }
  //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);
}
基礎
とします。


第3話へ 第5話へ

戻る

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

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