マルチスレッドのファイル書き込み
Posted: 2010年8月03日(火) 12:36
WinXP(SP3)でVC2008Expressを使っています。
マルチスレッドのアプリケーションで、動作ログをファイルに記録するために
下記のテストプログラムを作ってみたのですが、うまく動作せず困っています。
スレッド関数の中から、ファイルを排他制御して書き込みして、終了するだけ
のプログラムのつもりですが、実行しても終了せず止まってしまいます。
たまにちゃんと終了してくれる時もありますが・・。
デバッグ実行して、停止したプログラムを中断すると、
「プロセスはデッドロックされているか、ユーザーモードコードがどれも実行
されていません。すべてのスレッドが中止されました。」
というメッセージが出ます。ソースコードのカーソルを見ると、LockFileExの
ところで止まっているように見えるのですが、なぜここで止まるのか、原因が
まったくわかりません。
なにか間違えているのでしょうか・・。お助けください。m(_ _)m
─────────────< main.c >────────────────
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define THREAD_NUM 16
HANDLE thread[THREAD_NUM];
HANDLE hFile;
unsigned __stdcall ThreadProc( void *p )
{
UINT id = (UINT)p;
char buf[128];
DWORD dwWrite;
OVERLAPPED ov;
_snprintf( buf,128,"スレッド%dです。\r\n",id );
ZeroMemory( &ov, sizeof(OVERLAPPED) );
// ロックして追記書き込み
if( LockFileEx( hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &ov ) )
{
SetFilePointer( hFile, 0, NULL, FILE_END );
WriteFile( hFile, buf, strlen(buf), &dwWrite, NULL );
UnlockFileEx( hFile, 0, 1, 0, &ov );
}
_endthreadex(0);
return 0;
}
void main( void )
{
int i;
hFile = CreateFile( "out.txt", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile==INVALID_HANDLE_VALUE )
{
puts("CreateFileエラー");
return;
}
for( i=0; i<THREAD_NUM; i++ )
{
thread = (HANDLE)_beginthreadex( NULL, 0, ThreadProc, (void*)i, 0, NULL );
if( !thread )
puts("_beginthreadexエラー");
}
WaitForMultipleObjects( THREAD_NUM, thread, TRUE, INFINITE );
CloseHandle( hFile );
}
マルチスレッドのアプリケーションで、動作ログをファイルに記録するために
下記のテストプログラムを作ってみたのですが、うまく動作せず困っています。
スレッド関数の中から、ファイルを排他制御して書き込みして、終了するだけ
のプログラムのつもりですが、実行しても終了せず止まってしまいます。
たまにちゃんと終了してくれる時もありますが・・。
デバッグ実行して、停止したプログラムを中断すると、
「プロセスはデッドロックされているか、ユーザーモードコードがどれも実行
されていません。すべてのスレッドが中止されました。」
というメッセージが出ます。ソースコードのカーソルを見ると、LockFileExの
ところで止まっているように見えるのですが、なぜここで止まるのか、原因が
まったくわかりません。
なにか間違えているのでしょうか・・。お助けください。m(_ _)m
─────────────< main.c >────────────────
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define THREAD_NUM 16
HANDLE thread[THREAD_NUM];
HANDLE hFile;
unsigned __stdcall ThreadProc( void *p )
{
UINT id = (UINT)p;
char buf[128];
DWORD dwWrite;
OVERLAPPED ov;
_snprintf( buf,128,"スレッド%dです。\r\n",id );
ZeroMemory( &ov, sizeof(OVERLAPPED) );
// ロックして追記書き込み
if( LockFileEx( hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &ov ) )
{
SetFilePointer( hFile, 0, NULL, FILE_END );
WriteFile( hFile, buf, strlen(buf), &dwWrite, NULL );
UnlockFileEx( hFile, 0, 1, 0, &ov );
}
_endthreadex(0);
return 0;
}
void main( void )
{
int i;
hFile = CreateFile( "out.txt", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if( hFile==INVALID_HANDLE_VALUE )
{
puts("CreateFileエラー");
return;
}
for( i=0; i<THREAD_NUM; i++ )
{
thread = (HANDLE)_beginthreadex( NULL, 0, ThreadProc, (void*)i, 0, NULL );
if( !thread )
puts("_beginthreadexエラー");
}
WaitForMultipleObjects( THREAD_NUM, thread, TRUE, INFINITE );
CloseHandle( hFile );
}