Pergunta

Eu tenho um aplicativo multithread em C ++ para Windows 7. Este aplicativo é compilado como uma DLL para o uso de outro aplicativo C #.

Eu executo o código multithread por longas horas para processar dados de streaming. Se eu compilar este código C ++ em um .exe autônomo, e execute o código, funciona bem.

Mas quando é transformado em uma dll e quando o código C # é executado com ele, o programa falha com erro de violação de acesso após longas corridas. Eu vejo uma falha semelhante quando carrego a DLL de um script Python e corro por longas horas.

Quando assisto o comportamento usando o Gerenciador de Tarefas, vejo a contagem de alças do sistema aumentando em um ritmo muito rápido. Após cerca de 2 horas de execução de código, vejo a contagem de identificadores de 300.000 marcas e continua aumentando.

Dentro do código multithread, os encadeamentos estão sendo criados e rasgados continuamente. Eu vejo que depois que o tópico é encerrado, a alça de thread não é fechada explicitamente por uma função CloseHandle. Isso poderia ser um problema potencial?

Como eu confirmo que é um problema de punhos. Quais são as maneiras de assistir a esses recursos do sistema de uma maneira melhor? Antes de tentar quaisquer correções, gostaria de saber todas as soluções possíveis que as corridas de teste demorarem muito, mais de 5 horas, para reproduzir o acidente.

Foi útil?

Solução

sysinternals processo explorador pode ver as alças em um processo e identificarcomo linha, mutex, arquivo, etc..Você definitivamente tem que fechar () cada alça de thread para limpá-los.

Como de lado, a criação de um thread é uma operação cara.Se você estiver criando muitos trabalhos de thread, é melhor enfileirar os trabalhos e criar um conjunto de um número limitado de segmentos (geralmente igual ao número de CPUs no sistema) que puxe a partir da fila e execute o trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top