プロが教える店舗&オフィスのセキュリティ対策術

CreateFile、CloseHandleを繰り返し使用していると、CreateFileの戻りが極端に遅くなる(数秒)現象がありました。原因および対処方法を教えてください。お願いします。(WindowsXP SP2、VC.NET)

A 回答 (2件)

補足いただいたサンプルを若干書き換えて、以下のコードで試してみました。

CreateFileとCloseHandleの実行時間を簡易的に測定し、実行完了時にその最大値をミリ秒単位で表示するようになっています。

void CmfctestDlg::OnBnClickedButton1()
{
   DWORD dwCreateFile = 0;
   DWORD dwCloseHandle = 0;
   HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
   int i;
   for (i = 0; i < 10000; ++i) {
      WaitForSingleObject(hMutex, INFINITE);
      DWORD dw1 = GetTickCount();
      HANDLE hFile = CreateFile(
         "c:\\tmp\\test.txt",
         GENERIC_READ | GENERIC_WRITE,
         FILE_SHARE_READ | FILE_SHARE_WRITE,
         NULL,
         OPEN_EXISTING,
         0,
         0
         );
      if (hFile == INVALID_HANDLE_VALUE) {
         MessageBox("ouch!");
         break;
      }
      DWORD dw2 = GetTickCount();
      CloseHandle(hFile);
      DWORD dw3 = GetTickCount();
      ReleaseMutex(hMutex);
      if (dw2 - dw1 > dwCreateFile) {
         dwCreateFile = dw2 - dw1;
      }
      if (dw3 - dw2 > dwCloseHandle) {
         dwCloseHandle = dw3 - dw2;
      }
   }
   CString s;
   s.Format("CreateFile %d, CloseHandle %d", dwCreateFile, dwCloseHandle);
   MessageBox(s);
}

手抜きのためMFCを使ったのでMessageBoxとかCStringのあたりがナントモですが、大意は変わっていないかと思います。

これをWindows XP Professional SP2とWindows 2000 Professional SP4の上で動かしてみましたが、いずれもCreateFile, CloseHandleの実行時間の最大値は10ms~20ms程度になりました。

数秒も遅れる可能性があるのはWaitForSingleObjectのほうが高いような気がしますが、「他スレッド」のほうでMutexを長期間掴んでいるという可能性はないでしょうか。これについても、上記と同様の方法でWaitForSingleObjectの実行時間を測定すればハッキリするかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。早速試してみます。
本当にありがとうございました。

お礼日時:2005/10/14 15:12

現象を再現させる最小限の大きさのサンプルコードがあれば、適切な回答がつきやすいかと思います。

サンプルコードを出していただくことは可能でしょうか。(サンプルコードなしでは、適切な回答は得られないでしょう。)

この回答への補足

対応していただきありがとうございます。
以下がサンプルコードです。
省略しましたが、全てのコード前後にprintf()を入れてます。
CreateFile()の戻りが数秒遅れることがあるのは確かだと思われます。
どうかよろしくお願いいたします。

// CreateMutex()、ファイル新規作成は省略
for ( i = 0; i < 10000; i++ )
{
// 他スレッドとの排他のためMutex使用
WaitForSingleObject(hMutex, INFINITE);
sfd = CreateFile("fileName",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
CloseHandle(sfd);
ReleaseMutex(hMutex);
Sleep(1000);
}

補足日時:2005/10/13 13:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!