Por que fclose travar / deadlock? (Janelas
Tenho um processo de monitoração de alterações de diretório que lê atualizações de arquivos em um conjunto de diretórios. Eu tenho outro processo que executa pequenas gravações em muitos arquivos nesses diretórios (programa de teste). Figura cerca de 100 diretórios com 10 arquivos em cada um e cerca de 500 arquivos sendo modificados por segund
Depois de um tempo, o processo de monitoração de diretório trava uma chamada parafclose()
em um método que basicamente segue o arquivo. Neste método, eufopen()
no arquivo, verifique se o identificador é válido, faça algumas buscas e leituras e, em seguida, chamefclose()
. Essas leituras são todas executadas pelo mesmo encadeamento no processo. Após o travamento, o thread nunca progride.
Não consegui encontrar nenhuma informação boa sobre o porquêfclose()
pode entrar em conflito em vez de retornar algum tipo de código de erro. A documentação menciona_fclose_nolock()
, mas parece não estar disponível para mim (Visual Studio 2003
O travamento ocorre para compilações de depuração e lançamento. Em uma compilação de depuração, posso ver quefclose()
calls_free_base()
, que trava antes de retornar. Algum tipo de chamada para o kernel32.dll => ntdll.dll => KernelBase.dll => ntdll.dll está girando. Aqui está o assembly do ntdll.dll que faz um loop indefinidamente:
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 77CEB815
77CEB868 cmp dword ptr [edi+4Ch],0
77CEB86C je 77CEB87E
77CEB86E mov al,byte ptr [esi+2]
77CEB871 xor al,byte ptr [esi+1]
77CEB874 xor al,byte ptr [esi]
77CEB876 mov byte ptr [esi+3],al
77CEB879 mov eax,dword ptr [edi+50h]
77CEB87C xor dword ptr [esi],eax
77CEB87E mov ebx,dword ptr [ebx+4]
77CEB881 lea eax,[edi+0C4h]
77CEB887 cmp ebx,eax
77CEB889 jne 77CEB83F
Alguma idéia do que pode estar acontecendo aqu