今までの知識のみで、やってみましょう。
// 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