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