我有一个目录更改监视器进程,它从一组目录中的文件读取更新.我有另一个进程,对这些目录(测试程序)执行大量文件的小写操作.图大约100个目录,每个目录有10个文件,每秒约有500个文件被修改.
运行一段时间后,目录监视器进程挂起一个fclose()基本上拖尾文件的方法的调用.在这个方法中,我fopen()是文件,检查句柄是否有效,做一些搜索和读取,然后调用fclose().这些读取都由进程中的同一个线程执行.挂起后,线程永远不会进展.
我找不到任何关于为什么fclose()可能死锁而不是返回某种错误代码的好信息.文档确实提到了_fclose_nolock(),但似乎我没有(Visual Studio 2003).
调试和发布版本都会挂起.在调试版本中,我可以看到在返回之前挂起的fclose()调用_free_base().某种调用kernel32.dll => ntdll.dll => KernelBase.dll => ntdll.dll正在旋转.这是来自ntdll.dll的无限循环的程序集:
77CEB83F cmp dword ptr [edi+4Ch],0
77CEB843 lea esi,[ebx-8]
77CEB846 je 77CEB85E
77CEB848 mov eax,dword ptr [edi+50h]
77CEB84B xor dword ptr [esi],eax
77CEB84D mov al,byte ptr [esi+2]
77CEB850 xor al,byte ptr [esi+1]
77CEB853 xor al,byte ptr [esi]
77CEB855 cmp byte ptr [esi+3],al
77CEB858 jne 77D19A0B
77CEB85E mov eax,200h
77CEB863 cmp word ptr [esi],ax
77CEB866 ja …Run Code Online (Sandbox Code Playgroud)