第106章 マルチスレッド その8


さて、今回は子スレッドにファイルに書き込みをさせます。 また、メインスレッドでも同じファイルに書き込みをします。


今までの知識のみで、やってみましょう。

// mult09.c

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

unsigned __stdcall mythread(LPVOID);
CRITICAL_SECTION cs;

int main()
{
    int i;
    HANDLE hTh;
    DWORD thID;
    FILE *fp;

    InitializeCriticalSection(&cs);

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

    for (i = 1; i <= 100; i++) {
        EnterCriticalSection(&cs);
        fp = fopen("test.txt", "a");
        if (fp == NULL) {
            continue;
        }
        fprintf(fp, "Main---%d\n", i);
        fclose(fp);
        LeaveCriticalSection(&cs);
    }
    

    WaitForSingleObject(hTh, INFINITE);
    CloseHandle(hTh);

    DeleteCriticalSection(&cs);

    return 0;
}
まず、子スレッドを作ります。

次にtest.txtファイルを"a"モードで開きます。 これに、「Main---1」と書き込みます。 そしてファイルを閉じます。 次に、また同じファイルを開いて 「Main---2」と書き込みます。 これを100回繰り返します。

同様のことを、子スレッドにもさせましょう。

unsigned __stdcall mythread(LPVOID lpx)
{
    int i;
    FILE *fp;
    
    for (i = 1; i <= 100; i++) {
        EnterCriticalSection(&cs);
        fp = fopen("test.txt", "a");
        if (fp == NULL) {
            continue;
        }
        fprintf(fp, "Thread---%d\n", i);
        fclose(fp);
        LeaveCriticalSection(&cs);
    }
    return 0;
}
さて、実行結果はどうでしょうか。

test.txtというファイルができてるはずです。 この中身を見てください。

Mainと子のスレッドが時には交互に、時には 続けて書き込みをしているのがわかります。



さて、もうお気づきのことと思いますが、 ファイルに書き込みをする前に、スレッドはクリティカルセクションに 入って、書き込みが終わると、クリティカルセクションをでています。

これにより、同時に同じファイルにアクセスすることが回避されています。

クリティカルセクションを取り除いて、プログラムを動かしてみてください。 たいてい、ハングアップしてしまいます。

さて、今回のプログラムはもっと別な観点から書換えることができます。 次回以降少しずつ解説していくことにします。


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

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