第100章 マルチスレッド その2


前章では、子スレッドの終了をGetExitCodeThread関数で調べてSTILL_ACTIVEを返している間は、待機していました。

しかし、本来は待機関数を使うべきです。



ここでは、最も簡単な待機のプログラムを作ってみましょう。

DWORD WaitForSingleObject(
  HANDLE hHandle,        // オブジェクトのハンドル
  DWORD dwMilliseconds   // タイムアウト時間
);
hHandleには、オブジェクトのハンドルを指定します。
指定できるオブジェクトには、スレッド、イベント、ミューテックス、セマフォなどがあります。

dwMillisecondsには、タイムアウト時間を指定します。
これに、INFINITEを指定するとオブジェクトがシグナル状態になるまで待機します。

CreateThread関数はスレッドハンドルを返すので、これを第1引数に指定し、第2引数をINFINITEにすると、スレッドが終了するまで、この関数は待機します。

/* mult03.c */

#include <stdio.h>
#include <windows.h>
#include <process.h>

unsigned __stdcall mythread(void *);

int main()
{
    int i;
    HANDLE hTh;
    DWORD thID;

    hTh = (HANDLE)_beginthreadex(NULL, 0, mythread, NULL, 0, &thID);
    if (hTh == 0) {
        printf("スレッド作成失敗\n");
        return -1;
    }

    for (i = 0; i < 10; i++)
        printf("Main [%d]\n", i);

    WaitForSingleObject(hTh, INFINITE);
    CloseHandle(hTh);
    return 0;
}

unsigned __stdcall mythread(void *lpx)
{
    int i;
    for (i = 0; i < 20; i++)
        printf("子スレッド[%d]\n", i);

    printf("子スレッド終了!\n");

    return 0;
}
main関数のWaitForSingleObject関数で、子スレッドが終了するまで待機します。 シグナル状態になるとreturnして、main関数が終了します。

子スレッドが終了するまで、親は待機している様子がわかります。



[Index][総合Index] [Previous Chapter] [Next Chapter]

Update May/11/2004 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。