 さて、今回は子スレッドにファイルに書き込みをさせます。
また、メインスレッドでも同じファイルに書き込みをします。
さて、今回は子スレッドにファイルに書き込みをさせます。
また、メインスレッドでも同じファイルに書き込みをします。
今までの知識のみで、やってみましょう。
// 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と子のスレッドが時には交互に、時には
続けて書き込みをしているのがわかります。
Mainと子のスレッドが時には交互に、時には
続けて書き込みをしているのがわかります。
さて、もうお気づきのことと思いますが、
ファイルに書き込みをする前に、スレッドはクリティカルセクションに
入って、書き込みが終わると、クリティカルセクションをでています。
これにより、同時に同じファイルにアクセスすることが回避されています。
クリティカルセクションを取り除いて、プログラムを動かしてみてください。 たいてい、ハングアップしてしまいます。
さて、今回のプログラムはもっと別な観点から書換えることができます。 次回以降少しずつ解説していくことにします。
Update Dec/05/2004 By Y.Kumei