第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入門講義(基礎から応用まで)