Up

マルチ・スレッド(Multi-threads)プログラミング

 

Visual C++2008/CLRにおけるマルチ・スレッド・プログラミングの簡単なサンプル・プログラムを作成した。

マルチ・コア(CPU)のシステムの性能を有効に利用する1つの方法としてもマルチ・スレッドというプログラミング法は注目を集めている。

VC++2008/CLRの場合、スレッドとして走らせる関数はref classのメソッドを選ぶことができる。

スレッドは、メソッドのデリゲート(delegate: ポインタみたいなもの)を作成して、

そのデリゲートを基にスレッドを作成するという手順になる。

具体プログラム例(コンソール・アプリケーション)は、以下のとおりである。

なお、マルチ・コアPCにおいてスレッドを並行に走らせることによる処理速度の向上を示すプログラム例を、ホームページ

http://homepage2.nifty.com/okamotoy/cppsamples/multithreads/

に用意した。

 

// MultiThreads.cpp : メインプロジェクトファイルです。

 

#include "stdafx.h"

#include "WHRN.h"

 

using namespace System;

using namespace System::Threading;

using namespace myLib;

 

public ref class DoWrite {

    public:

            DoWrite(){}

            virtual ~DoWrite(){

                    if (rn1 != 0) delete rn1;

                    if (rn2 != 0) delete rn2;

            }

 

    WHrn * rn1, * rn2;  //  WHrn WHRN.h に用意されている乱数生成用クラス型

 

    void setDoWrite(){

            rn1 = new WHrn();

            rn2 = new WHrn( 1, 2, 3 );

    }

 

    void writing1(){

            for (int i = 0; i < 10; i++){

                    Console::WriteLine("i = " + i.ToString() + "   rn1 = " + rn1->uni().ToString());

                    Thread::Sleep(500);

            }

    }

 

 

    void writing2(){

            for (int j = 0; j < 5; j++){

                    Console::WriteLine("j = " + j.ToString() + "   rn2 = " + rn2->uni().ToString());

                    Thread::Sleep(1000);

            }

    }

 

};

 

int main(array<System::String ^> ^args)

{

    DoWrite ^ Writing = gcnew DoWrite();

    Writing->setDoWrite();

 

    //    デリゲート(ポインタみたいなもの)の生成

    ThreadStart ^ threadDelegate1 = gcnew ThreadStart( Writing, &DoWrite::writing1 );

    ThreadStart ^ threadDelegate2 = gcnew ThreadStart( Writing, &DoWrite::writing2 );

 

    //  デリゲートからスレッドを生成

    Thread ^ myThread1 = gcnew Thread( threadDelegate1 );

    Thread ^ myThread2 = gcnew Thread( threadDelegate2 );

 

    //  スレッドのスタート

    myThread1->Start();

    myThread2->Start();

 

    //  スレッドの終了待ち

    myThread1->Join();

    myThread2->Join();

    Console::WriteLine(L"Press Enter-key.");

    Console::ReadLine();

    return 0;

}

 

上記プログラムのソースコードファイルなどを圧縮ファイルとしてまとめたものは

ここをクリックするとダウンロードできる。ダウンロードしたファイルは

解凍後、Visual Studio/Visual C++2008から開くことができる。

 

Up